11. Προηγμένα χαρακτηριστικά της γλώσσας

Σχετικά έγγραφα
ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 11: Vectors (διανύσματα)

8. Το μοντέλο συμβάντων του AWT

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

Κλάσεις και Αντικείµενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Αντικειµενοστρεφής Προγραµµατισµός

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

2.1 Αντικειµενοστρεφής προγραµµατισµός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

Αντικειμενοστρεφής Προγραμματισμός

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Βασικά Στοιχεία της Java

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors Υπερφόρτωση Αντικείμενα ως παράμετροι

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστρεφής Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Πακέτα (Packages) Φωλιασμένες ή Εσωτερικές Κλάσεις (Inner Classes) Παναγιώτης Σφέτσος, PhD

2. Προσδιοριστές, δεσμευμένες λέξεις και τύποι

Εισαγωγή στον Προγ/μό Η/Υ

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Οντοκεντρικός Προγραμματισμός

Αντικειµενοστραφής Προγραµµατισµός

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

Βασικά Στοιχεία της Java

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Ειδικά Θέματα Προγραμματισμού

5. Αντικείμενα και κλάσεις

B. Ενσωμάτωση Ιθαγενών Μεθόδων

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Μπορείτε να δηλώσετε πίνακα οποιουδήποτε τύπου είτε βασικού είτε κλάσης:

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΑΦΗΡΗΜΕΝΕΣ ΚΛΑΣΕΙΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Constructors

Βασικά της γλώσσας JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Wrapper Classes, Abstract Classes and Interfaces

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #12

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Γενικά (για τις γραπτές εξετάσεις)

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

ΕΠΛ233 Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors, equals, tostring Αντικείμενα ως παράμετροι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

Προγράμματα με δομή Κληρονομικότητας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι String Interning

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Οντοκεντρικός Προγραμματισμός

(Διαφάνειες Νίκου Βιδάκη)

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Κλάσεις και αντικείμενα #include <iostream.h<

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστραφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

class object Database Database Item Item [sub-typing and polymorphism] MusicCD Video MusicCD Video

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

Transcript:

11. Προηγμένα χαρακτηριστικά της γλώσσας Τελειώνοντας το κεφάλαιο αυτό θα μπορείτε: Να καλείτε μεθόδους που έχετε υπερβεί, από τη μέθοδο που τις υπερβαίνει Να καλείτε μεθόδους δημιουργίας που έχετε υπερβεί Να ελέγχετε την κλήση των μεθόδων δημιουργίας των γονικών κλάσεων Να δηλώνετε και να χρησιμοποιείτε τις κατάλληλες static μεταβλητές και μεθόδους Να δηλώνετε και να χρησιμοποιείτε τις κατάλληλες final κλάσεις, μεθόδους και μεταβλητές Να δηλώνετε και να χρησιμοποιείτε σωστά τις αφηρημένες μεθόδους και τις διεπαφές Να περιγράφετε και να χρησιμοποιείτε τον εξ ορισμού και τον protected έλεγχο προσπέλασης Να χρησιμοποιείτε την ένδειξη deprecation για το μεταγλωττιστή Java ώστε να καθορίζετε τις κατάλληλες μεθόδους JDK 1.1 που θέλετε να χρησιμοποιήσετε. Να περιγράφετε και να χρησιμοποιείτε τις inner κλάσεις. 11.1 Κλήση μεθόδων που έχετε υπερβεί Συχνά, όταν υπερβαίνετε μία μέθοδο, ο πραγματικός σας σκοπός δεν είναι να αντικαταστήσετε την υπάρχουσα συμπεριφορά με νέα, αλλά να επεκτείνετε τη συμπεριφορά αυτή με κάποιο τρόπο. Αυτό μπορεί να επιτευχθεί με χρήση της δεσμευμένης λέξης super. public class Employee { String name; int salary; public String getdetails() { return Name: + name + \nsalary: + salary; public class Manager { String department; public String getdetails() { return super.getdetails() + \ndepartment: + department; Σημειώστε ότι μία κλήση της μορφής super.method() θα καλέσει ολόκληρη τη συμπεριφορά, μαζί με τυχόν παρενέργειες που αυτή έχει, της μεθόδου που θα είχε 1

κληθεί αν το αντικείμενο στο οποίο αναφερόμασταν άνηκε στην πραγματικότητα στη γονική κλάση. Η μέθοδος δε χρειάζεται να έχει οριστεί ακριβώς στη γονική κλάση, μπορεί να έχει κληροδοτηθεί από κάποια κλάση πιο ψηλά στην ιεραρχία. 11.2 Κανόνες υπέρβασης μεθόδων Υπάρχουν δύο σημαντικοί κανόνες για την υπέρβαση μεθόδων: Μία μέθοδος που υπερβαίνει μία άλλη δεν μπορεί να είναι λιγότερο προσπελάσιμη από την αρχική μέθοδο. Μία μέθοδος που υπερβαίνει μία άλλη δεν μπορεί να «πετάει» περισσότερες εξαιρέσεις από την αρχική μέθοδο. Αμφότεροι οι κανόνες προκύπτουν από τη φύση του πολυμορφισμού σε συνδυασμό με την ανάγκη της Java να είναι «ασφαλής ως προς τον τύπο». Έστω το πιο κάτω μη επιτρεπτό σενάριο: public class Parent { public void method() { public class Child extends Parent { private void method() { public class UseBoth { public void othermethod() { Parent p1 = new Parent(); Parent p2 = new Child(); p1.method(); p2.method(); Αν ήταν επιτρεπτό η method() στην κλάση Child να είναι ιδιωτική ενώ στην κλάση Parent είναι δημόσια, τότε ο πιο πάνω κώδικας θα ήταν επιτρεπτός. Όμως κατά την εκτέλεση θα προέκυπτε ένα πρόβλημα γιατί η μέθοδος method() που θα έπρεπε να εκτελεστεί για την p2 θα έπρεπε να είναι η έκδοση της method() για το Child, αλλά αυτή έχει δηλωθεί ως ιδιωτική, συνεπώς η πρόσβαση δεν είναι επιτρεπτή. Με παρόμοια λογική, στα πλαίσια του κανόνα «δήλωσε ή αντιμετώπισε» δεν επιτρέπεται να «πετάει» περισσότερες εξαιρέσεις από τη μέθοδο που υπερβαίνει. 11.3 Κλήση μεθόδων δημιουργίας που έχουμε υπερβεί Αν έχετε μία κλάση με πολλές μέθοδοι δημιουργίας μπορεί να θέλετε να επαναλάβετε όσα συμβαίνουν στη μία μέσα σε μία άλλη. Αυτό μπορεί να επιτευχθεί με τη δεσμευμένη λέξη this ως κλήση μεθόδου: 2

public class Employee { String name; int Salary; public Employee(String n, int s) { name = n; salary = s; public Employee(String n) { this(n, 0); public Employee() { this( Unknown ); Στην τρίτη μέθοδος δημιουργίας, η οποία δεν έχει ορίσματα, η κλήση this( Unknown ) στην πράξη μεταβιβάζει τον έλεγχο σε εκείνη την έκδοση μεθόδου δημιουργίας που δέχεται ως όρισμα ένα String και παρέχει το String. 11.4 Κλήση μεθόδων δημιουργίας των γονικών κλάσεων Η Java είναι ιδιαίτερα ιδιότροπη σε σχέση με την αρχικοποίηση των αντικειμένων. Αυτό συμβαίνει για να είμαστε σίγουροι σε σχέση με την ασφάλεια. Όταν δημιουργείτε ένα στιγμιότυπο ενός συγκεκριμένου αντικειμένου, λαμβάνει χώρα η ακόλουθη ακολουθία πράξεων: 1. Δεσμεύεται ο χώρος στη μνήμη και αρχικοποιείται σε «μηδενικές» τιμές 2. Για κάθε κλάση στην ιεραρχία, ξεκινώντας από την κορυφή a. Πραγματοποιείται ρητή αρχικοποίηση b. Καλείται μία μέθοδος δημιουργίας Το μοντέλο ασφάλειας της Java απαιτεί όλες οι απόψεις ενός αντικειμένου που περιγράφουν τη γονική κλάση του να έχουν πλήρως αρχικοποιηθεί πριν να αρχίσει να εκτελεί οτιδήποτε η θυγατρική κλάση. Σε πολλές περιπτώσεις, χρησιμοποιείται η εξ ορισμού μέθοδο δημιουργίας δηλαδή η μέθοδος δημιουργίας χωρίς ορίσματα για να αρχικοποιήσει το γονικό αντικείμενο. Αν χρειάζεται μπορείτε να ελέγξετε τον τρόπο με τον οποίο δημιουργείται μία γονική κλάση. public class Employee { String name; public Employee (String n) { name = n; 3

public class Manager extends Employee { String department; public Manager(String s, String d) { super(s); department = d; Σημείωση Η κλήση της super() μπορεί να περιέχει οποιονδήποτε αριθμό ορισμάτων απαιτούν οι αντίστοιχες μέθοδοι δημιουργίας στη γονική κλάση, αλλά πρέπει να είναι η πρώτη εντολή στη μέθοδο δημιουργίας. 11.5 Μεταβλητές κλάσης Ορισμένες φορές είναι επιθυμητό να έχουμε μία μεταβλητή η οποία μεταβιβάζεται ανάμεσα σε όλα τα στιγμιότυπα μίας κλάσης. Για παράδειγμα, μπορεί να χρησιμοποιηθεί ως βάση επικοινωνίας ανάμεσα σε όλα τα στιγμιότυπα ή για να παρακολουθούμε το πλήθος των στιγμιοτύπων που έχουν δημιουργηθεί. Μπορείτε να επιτύχετε αυτό το αποτέλεσμα σημειώνοντας τη μεταβλητή με τη δεσμευμένη λέξη static. Μία τέτοια μεταβλητή ορισμένες φορές ονομάζεται μεταβλητή κλάσης (class variable) για να διακριθεί από τη μεταβλητή μέλος ή μεταβλητή στιγμιοτύπου. public class Count { private int serialnumber; private static int counter = 0; public Count() { counter++; serialnumber = counter; Στο πιο πάνω παράδειγμα κάθε αντικείμενο που δημιουργείται λαμβάνει ένα μοναδικό σειριακό αριθμό, ξεκινώντας από το άνω και αυξάνοντάς τον. Η μεταβλητή counter διαμοιράζεται ανάμεσα σε όλα τα στιγμιότυπα, συνεπώς όταν η μέθοδος δημιουργίας ενός αντικειμένου την αυξάνει κατά ένα, το επόμενο αντικείμενο που δημιουργείται βλέπει την αυξημένη τιμή. Μία στατική μεταβλητή είναι παρόμοια κατά κάποιον τρόπο με μία καθολική μεταβλητή σε άλλες γλώσσες. Η Java δεν έχει καθολικές μεταβλητές με τον παραδοσιακό τρόπο, αλλά μία στατική μεταβλητή είναι μία μόνη μεταβλητή η οποία είναι προσπελάσιμη από όλα τα αντικείμενα της κλάσης. Αν μία στατική μεταβλητή είναι δηλωμένη και ως δημόσια, μπορεί να προσπελασθεί και εκτός της κλάσης. Για να το επιτύχετε αυτό δε χρειαζόσαστε καν κάποιο στιγμιότυπο της κλάσης. Μπορείτε αντ αυτού να αναφερθείτε σε αυτήν μέσω του ονόματος της κλάσης. public class StaticVar { public static int number; public class OtherClass { 4

public void method() { int x = StaticVar.number; 11.6 Μέθοδοι κλάσης Ορισμένες φορές χρειάζεται να έχετε πρόσβαση σε κώδικα προγράμματος χωρίς να υπάρχει στιγμιότυπο ενός συγκεκριμένου αντικειμένου. Μία μέθοδος που είναι σημειωμένη με τη δεσμευμένη λέξη static μπορεί να χρησιμοποιηθεί με τον τρόπο αυτό και ορισμένες φορές καλείται μέθοδος κλάσης (class method). public class GeneralFunction { public static int addup(int x, int y) { return x + y; public class UseGeneral { public void method() { int a = 9; int b = 10; int c = GeneralFunction.addUp(a, b); System.out.println( addup() gives + c); Επειδή μία static μέθοδος μπορεί να κληθεί χωρίς να υπάρχει στιγμιότυπο της κλάσης στην οποία ανήκει δεν υπάρχει τιμή this. Συνέπεια αυτού είναι ότι μία μέθοδος static δεν μπορεί να προσπελάσει οποιαδήποτε μεταβλητή εκτός από τα ορίσματά της και τις static μεταβλητές. Προσπαθώντας να προσπελάσετε μη στατικές μεταβλητές θα έχει ως αποτέλεσμα ένα σφάλμα μεταγλώττισης. public class Wrong { int x; public static void main(string args[]) { x = 9; // COMPILER ERROR 11.7 Η δεσμευμένη λέξη final 11.7.1. Final κλάσεις H Java επιτρέπει την εφαρμογή της δεσμευμένης λέξης final σε κλάσεις, και αν συμβεί κάτι τέτοιο δεν μπορούμε να έχουμε υποκλάσεις της κλάσης αυτής. Η κλάση java.lang.string για παράδειγμα είναι μία final κλάση. Αυτό μπορεί να γίνει για λόγους ασφαλείας, καθώς έτσι είμαστε σίγουροι ότι αν μία μέθοδος έχει μία αναφορά σε ένα String, και στην πράξη θα αντιμετωπίσει σίγουρα ένα String και όχι κάποια υποκλάση που ίσως έχει προστεθεί με άσχημους σκοπούς και θα έχει τροποποιημένη συμπεριφορά. 5

11.7.2. Final μέθοδοι Και ορισμένες μέθοδοι μπορούν να σημειωθούν ως final. Αν συμβεί κάτι τέτοιο τότε δεν είναι δυνατή η υπέρβαση της μεθόδου, με άλλα λόγια οι μέθοδοι αυτοί δεν είναι ιδεατές (virtual). Και πάλι αυτό γίνεται για λόγους ασφαλείας, ώστε αυτός που καλεί τη μέθοδο να γνωρίζει ότι η συμπεριφορά που θα προκύψει θα είναι η σωστή, αρχική, συμπεριφορά και όχι κάποια ανατρεπτική εναλλακτική συμπεριφορά. Οι μέθοδοι που έχουν δηλωθεί final ορισμένες φορές χρησιμοποιούνται για λόγους βελτιστοποίησης, καθώς ο μεταγλωττιστής μπορεί να παράγει κώδικα που να καλεί άμεσα τη μέθοδο, αντί να χρειάζεται να χρησιμοποιήσει τη συνήθη κλήση ιδεατών μεθόδων που εμπεριέχει μία αναζήτηση κατά το χρόνο εκτέλεσης για να αποφασισθεί ποια μέθοδος θα κληθεί. Οι μέθοδοι που δηλώνονται ως static ή private είναι αυτόματα και final, καθώς σε καμία από τις δύο περιπτώσεις δεν μπορεί να εφαρμοστεί η δυναμική ή καθυστερημένη σύνδεση. 11.7.3. Final μεταβλητές Αν μία μεταβλητή δηλωθεί ως final το αποτέλεσμα είναι ότι αυτή γίνεται σταθερά. Οποιαδήποτε προσπάθεια αλλαγής της τιμής μίας final μεταβλητής θα προκαλέσει σφάλμα μεταγλωττιστή. Σημείωση Αν σημειώσετε μία μεταβλητή τύπου αναφοράς, δηλαδή τύπου κάποιας κλάσης, ως final δε θα μπορείτε να αναφερθείτε σε άλλο αντικείμενο εκτός από το αρχικό, αλλά θα μπορείτε να μεταβάλλετε τα περιεχόμενα του αντικειμένου. 11.8 Αφηρημένες κλάσεις Ορισμένες φορές, κατά την ανάπτυξη μίας βιβλιοθήκης μπορεί να θέλετε να δημιουργήσετε μία κλάση που αναπαριστά κάποια βασική συμπεριφορά και να ορίσετε μεθόδους για αυτή την κλάση, αλλά δεν μπορείτε να υλοποιήσετε τη συμπεριφορά στην κλάση αυτή. Αντ αυτού έχετε σκοπό να υλοποιήσετε τις μεθόδους στις υποκλάσεις. Για παράδειγμα έστω η κλάση Drawing. Η κλάση πρέπει να αναπαριστά μεθόδους για ένα πλήθος ευκολιών σχεδίασης, αλλά αυτές πρέπει να υλοποιηθούν με τρόπο ανεξάρτητο από πλατφόρμα. Σαφώς δεν είναι δυνατό να προσπελάσουμε το υλικό video σε μία μηχανή και να συνεχίσει να είναι ανεξάρτητο από πλατφόρμα. Σκοπός είναι η κλάση Drawing να ορίζει ποιες μεθόδους θα πρέπει να υπάρχουν, αλλά θα πρέπει να δημιουργηθούν υποκλάσεις που εξαρτώνται από την πλατφόρμα οι οποίες θα υλοποιούν τη συμπεριφορά. Μία κλάση όπως η κλάση Drawing, η οποία δηλώνει την ύπαρξη κάποιων μεθόδων, αλλά όχι και την υλοποίηση συνήθως ονομάζεται αφηρημένη κλάση (abstract class). Μπορείτε να δηλώσετε μία κλάση ως αφηρημένη στη Java με χρήση της δεσμευμένης λέξης abstract. Κάθε μέθοδος που δεν ορίζεται θα πρέπει επίσης να σημειώνεται ως abstract. public abstract class Drawing { public abstract void drawdot(int x, int y); public void drawline(int x1, int y1, int x2, int y2) { // σχεδίαση με επαναληπτική χρήση της drawdot 6

Σημειώστε ότι μία κλάση abstract μπορεί να περιέχει μη αφηρημένες μεθόδους και μεταβλητές. Δεν μπορείτε να δημιουργήσετε ένα στιγμιότυπο μίας κλάσης abstract, παρά μόνο έμμεσα δημιουργώντας ένα στιγμιότυπο μίας υποκλάσης της. Οι υποκλάσεις των abstract κλάσεων πρέπει να παρέχουν υλοποιήσεις για όλες τις αφηρημένες μεθόδους των γονικών κλάσεών τους, διαφορετικά θεωρούνται και αυτές ως αφηρημένες. Μπορείτε να δηλώσετε μεταβλητές αναφορές με τύπο αυτό της abstract κλάσης. 11.9 Διεπαφές Μία διεπαφή (interface) είναι μία παραλλαγή της ιδέας μίας abstract κλάσης. Σε ένα interface όλες οι μέθοδοι είναι abstract και καμία δεν μπορεί να έχει σώμα. Επίσης ένα interface δεν μπορεί να περιέχει μεταβλητές μέλους. Το πλεονέκτημα ενός interface είναι ότι μπορεί να χρησιμοποιηθεί για να κάμψει τον κανόνα απλής κληρονομικότητας που επιβάλλει η Java. Ο ορισμός μίας κλάσης μπορεί να κάνει extend μία μόνο άλλη κλάση, αλλά μπορεί να υλοποιεί (implements) όσες διεπαφές χρειάζεται. Η υλοποίηση ενός interface είναι παρόμοια με τη δημιουργία υποκλάσεων, εκτός από το γεγονός ότι υλοποίηση μίας κλάσης δεν κληρονομεί συμπεριφορά από τον ορισμό ενός interface. Ό,τι συμβαίνει στην κλάση αυτή είναι γνωστό ότι υλοποιεί μία συγκεκριμένη διεπαφή. Αυτό σημαίνει ότι είναι δυνατό να κληθούν μέθοδοι που είναι μέλη του interface σε οποιοδήποτε στιγμιότυπο ενός αντικειμένου που υλοποιεί το interface αυτό. Όπως και με τις αφηρημένες κλάσεις, είναι επιτρεπτό να χρησιμοποιήσουμε το όνομα μίας διεπαφής ως τύπο σε μία μεταβλητή αναφοράς. Θα εφαρμοστεί η συνήθης δυναμική σύνδεση. Οι αναφορές μπορούν να μετατραπούν (cast) προς και από τύπους διεπαφών και μπορεί να χρησιμοποιηθεί ο τελεστής instanceof για να καθοριστεί αν ένα αντικείμενο υλοποιεί ένα interface. Οι διεπαφές χρησιμοποιούνται κατά τη διαχείριση συμβάντων στο AWT. public class ReactToButton implements ActionListener { public void actionperformed(actionevent e) { // αντίδραση στο συμβάν 11.10 Προηγμένος έλεγχος πρόσβασης Εκτός από τα επίπεδα πρόσβασης private και public στη Java ορίζονται ακόμα δύο επίπεδα ελέγχου πρόσβασης για χρήση σε μεταβλητές και μεθόδους μέλη. Αυτά είναι το εξ ορισμού επίπεδο ελέγχου πρόσβασης και ένα επίπεδο που ονομάζεται protected. Μία μεταβλητή ή μία μέθοδος έχει την εξ ορισμού προσβασιμότητα αν δεν υπάρχει ρητά κάποιος τροποποιητής ως μέρος της δήλωσής της. Τέτοια προσβασιμότητα σημαίνει ότι η 7

πρόσβαση είναι επιτρεπτή από οποιαδήποτε μέθοδο σε οποιαδήποτε κλάση που είναι μέλος του ίδιου πακέτου όπως και ο στόχος. Μία μεταβλητή ή μέθοδος η οποία έχει σημειωθεί με τον τροποποιητή protected στην πράξη είναι περισσότερο προσβάσιμη από μία με τον εξ ορισμού έλεγχο πρόσβασης. Μία protected μέθοδος ή μεταβλητή είναι προσβάσιμη από οποιαδήποτε μέθοδο σε οποιαδήποτε κλάση που ανήκει στο ίδιο πακέτο, αλλά είναι επίσης προσβάσιμη από οποιαδήποτε μέθοδο σε οποιαδήποτε από τις υποκλάσεις. 11.11 Deprecation Μεταξύ των εκδόσεων JDK 1.0, JDK 1.1, JDK 1.2, JDK 1.3 και JDK 1.4 έγινε σημαντική προσπάθεια για την τυποποίηση των ονομάτων των μεθόδων. Αποτέλεσμα αυτού είναι ότι ένας μεγάλος αριθμός μεθόδων δημιουργίας κλάσεων και κλήσεων μεθόδων έγινε παρωχημένος έχουν αντικατασταθεί από ένα όνομα μεθόδου που ακολουθεί μία περισσότερο αντικειμενοστρεφή προσέγγιση, και γενικά, κάνει τη ζωή του προγραμματιστή λιγότερο πολύπλοκη. Για παράδειγμα στην έκδοση JDK 1.0 στον ορισμό της κλάσης java.awt.component συνέβαιναν τα ακόλουθα: Αλλαγή / λήψη του μεγέθους της συνιστώσας o resize() και size() Αλλαγή / λήψη του πλαισίου που περιέχει τη συνιστώσα o reshape() και bounds() Στην έκδοση JDK 1.1 οι πιο πάνω μέθοδοι της java.awt.component έγιναν deprecated και αντικαταστάθηκαν από μεθόδους που χρησιμοποιούσαν τις λέξεις get και set για να δηλώσουν τη βασική πράξη της μεθόδου setsize() και getsize() setbounds() και getbounds() Στην έκδοση JDK 1.1.1 συνεχίζουν να υπάρχουν deprecated μέθοδοι μαζί με τις νέες μεθόδους, αλλά η κατάσταση αυτή πρόκειται να αλλάξει στο μέλλον. Όποτε μεταφέρετε κώδικα από το JDK 1.0 στο JDK 1.1, ή ακόμα αν χρησιμοποιείτε κώδικα που λειτουργούσε με την έκδοση JDK 1.0, είναι σκόπιμο η μεταγλώττιση να γίνεται με την ένδειξη deprecation: % javac deprecation MyFile.java Η ένδειξη deprecation θα αναφέρει όσες μεθόδους που καλούνται από μέσα από την κλάση και οι οποίες είναι deprecated. Για παράδειγμα, ακολουθεί μία βοηθητική κλάση με το όνομα DateConverter για τη μετατροπή μίας ημερομηνίας που είναι στη μορφή mm/dd/yy στην ημέρα της εβδομάδας. package myutilities; import java.util.*; public final class DateConverter { private static String day_of_the_week[] = { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ; 8

public static String getdayofweek (String thedate) { int month, day, year; StringTokenizer st = new StringTokenizer(theDate, / ); month = Integer.parseInt(st.nextToken()); day = Integer.parseInt(st.nextToken()); year = Integer.parseInt(st.nextToken()); Date d = new Date(year, month, day); return(day_of_the_week[d.getday()]); Όταν μεταγλωττιστεί με χρήση του JDK 1.1 και με την ένδειξη deprecation: % javac deprecation DateConverter.java DateConverter.java:20: Note:The constructor java.util.date(int,int,int) has been deprecated. Date d = new Date(year, month, day); ^ DateConverter.java:23: Note: The method int getday() in class java.util.date has been deprecated. return (day_of_the_week[d.getday()]); ^ Note: DateConverter.java uses a deprecated API. Please consult the documentation for a better alternative. 3 warnings Ξαναγράφοντας την κλάση DateConverter έχουμε το εξής: package myutilities; import java.util.*; public final class DateConverter { private static String day_of_the_week[] = { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ; public static String getdayofweek (String thedate) { Date d = null; SimpleDateFormat sdf = new SimpleDateFormat( MM/dd/yy ); try { d = sdf.parse(thedate); catch (ParseException e) { System.out.println(e); e.printstacktrace(); 9

// Create a GregorianCalendar object Calendar c = new GregorianCalendar(TimeZone.getTimeZone( EST, Locale.US); c.settime(d); return (day_of_the_week[(c.get(calendar.day_of_week)-1)]); Εδώ στην έκδοση 1.1 χρησιμοποιούνται δύο νέες κλάσεις: η SimpleDateFormat, μία κλάση που δέχεται μία μορφή ημερομηνίας σε String και δημιουργεί ένα αντικείμενο Date και η κλάση GregorianCalendar, η οποία χρησιμοποιείται για να δημιουργηθεί ένα ημερολόγιο με την τοπική ζώνη ώρας και το locale. 11.12 Inner κλάσεις Οι inner κλάσεις, οι οποίες ονομάζονται και ένθετες κλάσεις (nested classes), είναι ένα νέο χαρακτηριστικό από το JDK 1.1. Στις προηγούμενες εκδόσεις του JDK επιτρέπονταν μόνο κλάσεις άνω επιπέδου το αρχείο java έπρεπε να περιέχει μόνο κλάσεις που ήταν μέλη του δηλωμένου πακέτου. Το JDK 1.1 υποστηρίζει πλέον κλάσεις που είναι μέλη άλλων κλάσεων, και ορίζονται τοπικά μέσα σε ένα μπλοκ εντολών ή ανώνυμα μέσα σε μία έκφραση. Οι inner κλάσεις έχουν τις ακόλουθες ιδιότητες: Το όνομα της κλάσης μπορεί να χρησιμοποιηθεί μόνο μέσα στο καθορισμένο πεδίο εμβέλειας (scope), εκτός και αν χρησιμοποιείται μέσα σε ένα πλήρες όνομα (qualified name). Το όνομα της inner κλάσης πρέπει να διαφέρει από αυτό της κλάσης που την περιέχει. Η inner κλάση μπορεί να χρησιμοποιεί τόσο μεταβλητές στιγμιοτύπου και κλάσης της κλάσης που την περιέχει όσο και τοπικές μεταβλητές του μπλοκ που την περιέχει. Η inner κλάση μπορεί να οριστεί και ως abstract. H inner «κλάση» μπορεί να είναι διεπαφή, η οποία υλοποιείται από άλλη κλάση. Οι inner κλάσεις μπορούν να δηλωθούν ως private ή protected. Η προστασία πρόσβασης δεν αποτρέπει μία inner κλάση να χρησιμοποιεί οποιοδήποτε μέλος μίας άλλης κλάσης, εφόσον η μία περιέχει την άλλη. Οι inner κλάσεις που δηλώνονται static γίνονται αυτόματα πρώτου επιπέδου κλάσεις χάνουν την ικανότητά τους να χρησιμοποιούν δεδομένα ή μεταβλητές μέσα στο τοπικό πεδίο εμβέλειας και άλλες inner κλάσεις. Οι inner κλάσεις δεν μπορούν να δηλώσουν μέλη τους ως static μόνο οι πρώτου επιπέδου κλάσεις μπορούν να ορίζουν static μέλη. Μία inner κλάση που θα ήθελε να χρησιμοποιήσει ένα static μέλος θα πρέπει να το ορίσει ως static στην κλάση πρώτου επιπέδου. Οι inner κλάσεις χρησιμοποιούνται καλύτερα ως ένα χαρακτηριστικό ευκολίας για τη δημιουργία προσαρμοστών συμβάντων (event adapters). Έστω η κλάση TwoListen με δύο κλάσεις χειριστές: 10

import java.awt.*; import java.awt.event.*; public class TwoListenInner { private Frame f; private TextField tf; public static void main(string args[]) { TwoListenInner that = new TwoListenInner(); that.go(); public void go() { f = new Frame( Two listeners example ); f.add = ( North, new Label( Click and drag the mouse )); tf = new TextField(30); f.add ( South, tf); f.addmousemotionlistener(new MouseMotionHandler()); f.addmouselistener(new MouseEventHandler()); f.setsize(300, 200); f.setvisible(true); // The MouseMotionHandler is an inner class public class MouseMotionHandler extends MouseMotionAdapter { public void mousedragged(mouseevent e); String s = Mouse dragging: X = + e.getx() + Y = + e.gety(); tf.settext(s); // MouseEventHandler public class MouseEventHandler extends MouseAdapter { public void mouseentered (MouseEvent e) { String s = The mouse entered ; tf.settext(s); public void mouseexited(mouseevent e) { String s = The mouse has left the building ; tf.settext(s); 11

Τα πλεονεκτήματα της προσέγγισης αυτής είναι ότι αμφότερες οι κλάσεις MouseMotionHandler και MouseEventHandler συμπεριλαμβάνονται στο αρχείο TwoListenInner.class και το συνολικό μέγεθος του προγράμματος είναι μικρότερο. Το μέγεθος της TwoListenInner σε μία κλάση είναι 1362 bytes. Αν τα πιο πάνω γράφονταν με τις δύο επιπλέον κλάσεις σε πρώτο επίπεδο θα δημιουργούνταν τρεις διαφορετικές κλάσεις και το συνολικό μέγεθος της εφαρμογής θα είναι 2864 bytes. 11.12.1. Ανώνυμες κλάσεις Επίσης είναι δυνατό να περιληφθεί μια ολόκληρη κλάση μέσα στο πεδίο εμβέλειας μίας έκφρασης. Η προσέγγιση αυτή ορίζει την ανώνυμη κλάση και δημιουργεί ένα στιγμιότυπο ταυτόχρονα. Για παράδειγμα θα μπορούσαμε να ξαναγράψουμε μέρος του TwoListenInner ώστε να περιέχει μία ανώνυμη κλάση ως εξής: public void go() { f = new Frame( Two listeners example ); f.add = ( North, new Label( Click and drag the mouse )); tf = new TextField(30); f.add ( South, tf); f.addmousemotionlistener(new MouseMotionAdapter() { public void mousedragged (MouseEvent e) { String s = Mouse dragging: X = + e.getx() + Y = + e.gety(); tf.settext(s); ); // προσοχή στην παρένθεση που κλείνει f.addmouselistener(new MouseEventHandler()); f.setsize(300, 200); f.setvisible(true); Ενώ οι ανώνυμες κλάσεις παρέχουν ακόμα μικρότερα μεγέθη αρχείων κλάσεων (η TwoListenInner με αμφότερους τους προσαρμοστές γραμμένους με χρήση ανώνυμων κλάσεων γίνεται μόνο 1291 bytes), όπως μπορείτε να δείτε ο κώδικας γίνεται όλο και περισσότερο μπερδεμένος. Οι ανώνυμες κλάσεις μπορούν να έχουν αρχικοποιήσεις αλλά όχι μέθοδοι δημιουργίας. Η λίστα των ορισμάτων που περνάνε στην έκφραση new (συνήθως κενή) μεταβιβάζεται στη μέθοδο δημιουργίας της υπερκλάσης. 11.12.2. Πώς λειτουργούν οι inner κλάσεις; Οι inner κλάσεις έχουν πρόσβαση στο πεδίο εμβέλειας της κλάσης που τις περιλαμβάνει, συνεπώς ο μεταγλωττιστής JDK 1.1 προσθέτει μία επιπλέον ιδιωτική μεταβλητή στιγμιοτύπου στην inner κλάση και μια μέθοδο δημιουργίας. Επιπρόσθετα, ο 12

μεταγλωττιστής εφαρμόζει αυτόματα το πεδίο εμβέλειας της κλάσης που την περιλαμβάνει στην inner κλάση, αντικαθιστώντας το συνήθη συμβολισμό με τελεία «.» με ένα «$». Συνεπώς ο τροποποιημένος πηγαίος κώδικας δείχνει κάπως έτσι στο μεταγλωττιστή: import java.awt.*; import java.awt.event.*; public class TwoListenInner { // Τα υπόλοιπα στοιχεία παραμένουν ως έχουν public void go() {... f.addmousemotionlistener (new TwoListenInner$MouseMotionHandler(this));... class TwoListenInner$MouseMotionHandler extends MouseMotionAdapter { // saved copy of TwoListenInner.this private TwoListenInner this$0; // Compiler generated constructor TwoListenerInner$MouseMotionHandler (TwoListenInner this$0) { this.this$0 = this$0; public void mousedragged(mouseevent e); String s = Mouse dragging: X = + e.getx() + Y = + e.gety(); this$0.tf.settext(s); 11.13 Η κλάση Vector Η κλάση Vector παρέχει μεθόδους για εργασία με δυναμικούς πίνακες με στοιχεία διαφόρων τύπων. java.lang.object + ------------- java.util.vector 11.13.1. Σύνοψη public class Vector extends Object implements Cloneable 13

Κάθε διάνυσμα (vector) διατηρεί μία capacity (χωρητικότητα) και μία capacityincrement (αύξηση χωρητικότητας). Όπως προστίθενται στοιχεία σε ένα διάνυσμα, ο χώρος αποθήκευσης για το διάνυσμα αυξάνει σε τμήματα μεγέθους ίσο με τη μεταβλητή capacityincrement. Η χωρητικότητα ενός διανύσματος είναι πάντα τουλάχιστον ίση με το μέγεθος του διανύσματος (και συνήθως μεγαλύτερη). 11.13.2. Μέθοδοι δημιουργίας Στη συνέχεια παρουσιάζονται οι μέθοδοι δημιουργίας της κλάσης Vector. public Vector() Δημιουργεί ένα κενό διάνυσμα public Vector(int initialcapacity) Δημιουργεί ένα κενό διάνυσμα με αποθηκευτικό χώρο ίσο με την καθορισμένη χωρητικότητα. public Vector(int initialcapacity, int capacityincrement) Δημιουργεί ένα κενό διάνυσμα με αποθηκευτικό χώρο ίσο με την καθορισμένη χωρητικότητα και την καθορισμένη capacityincrement. 11.13.3. Μεταβλητές Η κλάση Vector περιέχει τις ακόλουθες μεταβλητές στιγμιοτύπου: protected int capacityincrement το μέγεθος της αύξησης. (Αν είναι 0, το μέγεθος της ενδιάμεσης μνήμης διπλασιάζεται κάθε φορά που χρειάζεται να αυξηθεί το διάνυσμα). protected int elementcount το πλήθος των στοιχείων στην ενδιάμεση μνήμη. protected Object elementdata[] η ενδιάμεση μνήμη στην οποία αποθηκεύονται τα στοιχεία. 11.13.4. Μέθοδοι Στη συνέχεια παρουσιάζονται ορισμένες από τις μεθόδους της κλάσης Vector. Αναφερθείτε στο Java API για την περιγραφή όλων των μεθόδων της κλάσης. public final int size() Επιστρέφει το πλήθος των στοιχείων στο διάνυσμα. (Δεν είναι η χωρητικότητα του διανύσματος). public final boolean contains(object elem) Επιστρέφει true αν το καθορισμένο αντικείμενο είναι μια από τις τιμές στη συλλογή. public final int indexof(object elem) Αναζητεί το καθορισμένο στοιχείο ξεκινώντας από την πρώτη θέση και επιστρέφει ένα δείκτη σε αυτό (ή 1 αν δε βρεθεί το στοιχείο). Χρησιμοποιεί τη μέθοδο equals() του αντικειμένου, συνεπώς αν το αντικείμενο δεν υπερβαίνει τη μέθοδο equals() του Object θα συγκρίνει μόνο αναφορές αντικειμένων και όχι τα περιεχόμενα. public final synchronized Object elementat (int index) Επιστρέφει το στοιχείο που βρίσκεται στο συγκεκριμένο δείκτη. «Πετάει» ArrayIndexOutOfBoundException αν το index δεν είναι επιτρεπτό public final synchronized void setelementat(object obj, int index) Αντικαθιστά το στοιχείο στο συγκεκριμένο δείκτη με το συγκεκριμένο αντικείμενο 14

«Πετάει» ArrayIndexOutOfBoundException αν το index δεν είναι επιτρεπτό public final synchronized void removeelementat(int index) Διαγράφει το στοιχείο στο συγκεκριμένο δείκτη. «Πετάει» ArrayIndexOutOfBoundException αν το index δεν είναι επιτρεπτό public final synchronized void addelement(object obj) Προσθέτει το συγκεκριμένο αντικείμενο ως το τελευταίο στοιχείο του διανύσματος. public final synchronized void insertelementat(object obj, int index) Εισαγάγει το συγκεκριμένο αντικείμενο στη συγκεκριμένη θέση, μετακινώντας προς τα πάνω τα στοιχεία με ίσο ή μεγαλύτερο δείκτη. «Πετάει» ArrayIndexOutOfBoundException αν το index δεν είναι επιτρεπτό 11.13.5. Παράδειγμα Vector Το ακόλουθο παράδειγμα μπορεί να χρησιμοποιηθεί για την προσθήκη στοιχείων διαφόρων τύπων σε ένα διάνυσμα και για την εκτύπωση των στοιχείων του διανύσματος. Σημείωση Το πρόγραμμα χρησιμοποιεί μεθόδους από τις κλάσεις που έχουμε ήδη περιγράψει στο κεφάλαιο αυτό. import java.util.*; public class MyVector extends Vector { public myvector () { super(1,1); // storage capacity & capacityincrement public void addint(int i) { addelement(new Integer(i)); // η addelement απαιτεί στοιχείο τύπου Object public void addfloat(float f) { addelement(new Float(f)); public void addstring(string s) { addelement(s); public void addchararray(char a[]) { addelement(a); public void printvector() { Object o; 15

int length = size(); // compare with capacity() System.out.println( Number of vector elements is + length + and they are: ); for (int i=0; i < length; i++) { o = elementat(i); if (o instanceof char[]) { //System.out.println(o.toString()); prints garbage System.out.println(String.copyValueOf((char[])o)); else { System.out.println(o.toString()); public static void main(string args[]) { MyVector v = new MyVector(); int digit = 5; float real = 3.14f; char letters[] = { a, b, c, d ; String s = new String( Hi there! ); v.addint(digit); v.addfloat(real); v.addstring(s); v.addchararray(letters); v.printvector(); Το πρόγραμμα παράγει την ακόλουθη έξοδο: $ java MyVector Number of vector elements is 4 and are: 5 3.14 Hi there! abcd 11.14 Ασκήσεις 11.14.1. Επίπεδο 1: Τροποποίηση Bank 1. Ξαναγράψτε το rollover applet (Mover.java) ώστε να χρησιμοποιεί inner κλάσεις ή/και κλάσεις προσαρμοστές. 16

2. Συγκρίνετε το συνολικό μέγεθος των αρχείων.class που δημιουργούνται. 11.14.2. Επίπεδο 2: Προσθήκη μεθόδων find και delete στην κλάση MyVector 1. Προσθέστε μία μέθοδο find στην κλάση MyVector η οποία να επιστρέφει τη θέση του στοιχείου που μεταβιβάστηκε ως όρισμα. Η μέθοδος θα πρέπει να επιστρέφει 1 αν το όρισμα δε βρέθηκε στο διάνυσμα. Παράδειγμα εξόδου $ java MyVectorFind 3.14 3.14 is located at index 1 Number of vector elements is 4 and are: 5 3.14 Hi there! abcd $ java MyVectorFind c args[0] =c not found in vector Number of vector elements is 4 and are: 5 3.14 Hi there! abcd 2. Προσθέστε μία μέθοδο delete στην κλάση MyVector η οποία να αφαιρεί όλα τα στοιχεία που ταιριάζουν στο όρισμα. Η μέθοδος θα πρέπει να επιστρέφει true ή false: true αν η διαγραφή πέτυχε και false διαφορετικά (με την έννοια ότι το στοιχείο δεν υπάρχει στο διάνυσμα). Παράδειγμα εξόδου $ java MyVectorDelete 3.14 Elements 3.14 successfully deleted from vector Number of vector elements is 3 and are: 5 Hi there! abcd 17