This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
java:anon_inner_classes [2015/04/30 15:55] gthanos created |
java:anon_inner_classes [2017/05/12 14:44] gthanos |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Ανώνυμές εμφωλευμένες κλάσεις ====== | + | ====== Ανώνυμες εμφωλευμένες κλάσεις ====== |
- | Οι ανώνυμές εμφωλευμένες κλάσεις επιτρέπουν τον ταυτόχρονο ορισμό της υλοποίησης της κλάσης μαζί με την δημιουργία ενός αντικειμένου της κλάσης αυτής, σε μία εντολή. Οι κλάσεις αυτές χρησιμοποιούνται στην συγγραφή προγραμμάτων και πρέπει **α)** να υλοποιούν ένα υφιστάμενο interface ή **β)** να επεκτείνουν μία υφιστάμενη κλάση. Δείτε το παράδειγμα που παρουσιάστηκε στις μη στατικές εμφωλευμένες κλάσεις αλλαγμένο, ώστε να χρησιμοποιεί ανώνυμες κλάσεις | + | Οι ανώνυμές εμφωλευμένες κλάσεις επιτρέπουν τον ταυτόχρονο ορισμό της υλοποίησης της κλάσης μαζί με την δημιουργία ενός αντικειμένου της κλάσης αυτής, σε μία εντολή. Οι κλάσεις αυτές **ΠΡΕΠΕΙ** **α)** __να υλοποιούν ένα υφιστάμενο interface__ ή **β)** __να επεκτείνουν μία υφιστάμενη κλάση__. Δείτε το παράδειγμα που παρουσιάστηκε στις μη στατικές εμφωλευμένες κλάσεις αλλαγμένο, ώστε να χρησιμοποιεί ανώνυμες κλάσεις |
- | <code java DataStructure.java> | + | <code java HelloWorldAnonymousClasses.java> |
- | public class DataStructure { | + | public class HelloWorldAnonymousClasses { |
| | ||
- | // Create an array | + | interface HelloWorld { |
- | private final static int SIZE = 15; | + | public void greet(); |
- | private int[] arrayOfInts = new int[SIZE]; | + | public void greetSomeone(String someone); |
- | + | ||
- | public DataStructure() { | + | |
- | // fill the array with ascending integer values | + | |
- | for (int i = 0; i < SIZE; i++) { | + | |
- | arrayOfInts[i] = i; | + | |
- | } | + | |
} | } | ||
| | ||
- | interface DataStructureIterator extends java.util.Iterator<Integer> { } | + | public void sayHello() { |
- | + | ||
- | public void printEven() { | + | |
| | ||
- | // Print out values of even indices of the array | + | class EnglishGreeting implements HelloWorld { |
- | //DataStructureIterator iterator = this.new EvenIterator(); | + | String name = "world"; |
- | DataStructureIterator iterator = new DataStructureIterator() { | + | public void greet() { |
- | // Start stepping through the array from the beginning | + | greetSomeone("world"); |
- | private int nextIndex = 0; | + | } |
+ | public void greetSomeone(String someone) { | ||
+ | name = someone; | ||
+ | System.out.println("Hello " + name); | ||
+ | } | ||
+ | } | ||
| | ||
- | public boolean hasNext() { | + | HelloWorld englishGreeting = new EnglishGreeting(); |
- | + | ||
- | // Check if the current element is the last in the array | + | |
- | return (nextIndex <= SIZE - 1); | + | |
- | } | + | |
| | ||
- | public Integer next() { | + | HelloWorld frenchGreeting = new HelloWorld() { |
- | + | String name = "tout le monde"; | |
- | // Record a value of an even index of the array | + | public void greet() { |
- | Integer retValue = Integer.valueOf(arrayOfInts[nextIndex]); | + | greetSomeone("tout le monde"); |
- | + | ||
- | // Get the next even element | + | |
- | nextIndex += 2; | + | |
- | return retValue; | + | |
} | } | ||
+ | public void greetSomeone(String someone) { | ||
+ | name = someone; | ||
+ | System.out.println("Salut " + name); | ||
+ | } | ||
+ | }; | ||
| | ||
- | public void remove() { } | + | HelloWorld spanishGreeting = new EnglishGreeting() { |
- | + | String name = "mundo"; | |
+ | public void greet() { | ||
+ | greetSomeone("mundo"); | ||
+ | } | ||
+ | public void greetSomeone(String someone) { | ||
+ | name = someone; | ||
+ | System.out.println("Hola, " + name); | ||
+ | } | ||
}; | }; | ||
- | while (iterator.hasNext()) { | + | englishGreeting.greet(); |
- | System.out.print(iterator.next() + " "); | + | frenchGreeting.greetSomeone("Fred"); |
- | } | + | spanishGreeting.greet(); |
- | System.out.println(); | + | |
- | } | + | |
- | + | ||
- | public static void main(String s[]) { | + | |
- | DataStructure ds = new DataStructure(); | + | |
- | ds.printEven(); | + | |
} | } | ||
+ | |||
+ | public static void main(String... args) { | ||
+ | HelloWorldAnonymousClasses myApp = | ||
+ | new HelloWorldAnonymousClasses(); | ||
+ | myApp.sayHello(); | ||
+ | } | ||
} | } | ||
</code> | </code> | ||
+ | Παρατηρήστε ότι η μεταβλητή //frenchGreeting// προκύπτει από μία κλάση που υλοποιεί το inteface //HelloWorld// η μεταβλητή //spanishGreeting// προκύπτει ως επέκταση της κλάση //EnglishGreeting//. | ||
+ | |||
+ | ===== Πρόσβαση στις τοπικές μεταβλητές και στις μεταβλητές της εξωτερικής κλάσης ===== | ||
+ | Σε αναλογία με τις [[java:local_inner_classes|τοπικές εμφωλευμένες κλάσεις]] οι ανώνυμες κλάσεις έχουν τις ίδιες δυνατότητες πρόσβασης στις τοπικές μεταβλήτές της μεθόδου στην οποία ορίζονται: | ||
+ | * Η ανώνυμη κλάση έχει πρόσβαση στις μεταβλητές της εξωτερικής κλάσης. | ||
+ | * Η ανώνυμη κλάση δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές της μεθόδου στην οποία ορίζονται αν αυτές δεν έχουν δηλωθεί ως //final//. | ||
+ | * Όπως σε όλες τις μη στατικές εμφωλευμένες κλάσεις ο ορισμός του ίδιου τύπου δεδομένων στην εσωτερική και την εξωτερική κλάση "//κρύβει//" τον συγκεκριμένο τύπο δεδομένων από την εξωτερική κλάση. | ||
+ | * Δεν μπορείτε να ορίσετε στατικές μεταβλητές ή μεθόδους μέσα σε μία ανώνυμη κλάση. | ||
+ | Σε μία ανώνυμη κλάση μπορείτε να ορίσετε τα εξής: | ||
+ | * Πεδία | ||
+ | * Επιπλέον μεθόδους που δεν ορίζονται στη interface ή στην κλάση που επεκτείνει. | ||
+ | * Μεθόδους ή block αρχικοποίησης πεδίων της κλάσης. | ||
+ | * Τοπικές κλάσεις που ανήκουν στη ανώνυμη κλάση. | ||
+ | * **ΔΕΝ** μπορείτε και __δεν έχει νόημα__ να ορίσετε κατασκευαστές μέσα σε μία ανώνυμη κλάση. |