java:anon_inner_classes

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revision Both sides next revision
java:anon_inner_classes [2015/04/30 15:55]
gthanos created
java:anon_inner_classes [2016/02/26 11:15]
127.0.0.1 external edit
Line 1: Line 1:
 ====== Ανώνυμές εμφωλευμένες κλάσεις ====== ====== Ανώνυμές εμφωλευμένες κλάσεις ======
  
-Οι ανώνυμές εμφωλευμένες κλάσεις επιτρέπουν τον ταυτόχρονο ορισμό της υλοποίησης της κλάσης μαζί με την δημιουργία ενός αντικειμένου της κλάσης αυτής, σε μία εντολή. Οι κλάσεις αυτές ​χρησιμοποιούνται στην συγγραφή προγραμμάτων και πρέπει ​**α)** να υλοποιούν ένα υφιστάμενο ​interface ​ή **β)** να επεκτείνουν μία υφιστάμενη κλάση. Δείτε το παράδειγμα που παρουσιάστηκε στις μη στατικές εμφωλευμένες κλάσεις αλλαγμένο,​ ώστε να χρησιμοποιεί ανώνυμες κλάσεις+Οι ανώνυμές εμφωλευμένες κλάσεις επιτρέπουν τον ταυτόχρονο ορισμό της υλοποίησης της κλάσης μαζί με την δημιουργία ενός αντικειμένου της κλάσης αυτής, σε μία εντολή. Οι κλάσεις αυτές ​**ΠΡΕΠΕΙ** ​**α)** ​__να υλοποιούν ένα υφιστάμενο ​interface__ ​ή **β)** ​__να επεκτείνουν μία υφιστάμενη κλάση__. Δείτε το παράδειγμα που παρουσιάστηκε στις μη στατικές εμφωλευμένες κλάσεις αλλαγμένο,​ ώστε να χρησιμοποιεί ανώνυμες κλάσεις
  
 <code java DataStructure.java>​ <code java DataStructure.java>​
Line 22: Line 22:
     ​     ​
     // Print out values of even indices of the array     // Print out values of even indices of the array
-    //​DataStructureIterator iterator = this.new EvenIterator();​ 
     DataStructureIterator iterator = new DataStructureIterator() {     DataStructureIterator iterator = new DataStructureIterator() {
       // Start stepping through the array from the beginning       // Start stepping through the array from the beginning
Line 59: Line 58:
 </​code>​ </​code>​
  
 +Παρατηρήστε ότι η ορίζουμε μία νέα κλάση που υλοποιεί το interface //​DataStructureIterator//​ χωρίς να δώσουμε όνομα στην νέα κλάση (η κλάση προσδιορίζεται από τον τύπο δεδομένων που ορίζει το interface). Παράλληλα με τον ορισμό της κλάσης,​ δημιουργείται ένα νέο αντικείμενο,​ στο οποίο δείχνει η μεταβλητή //​iterator//​. Η συγκεκριμένη κλάση δημιουργήθηκε με βάση το inteface //​DataStructureIterator//​. Παρακάτω δίνεται ένα άλλο παράδειγμα,​ όπου η ανώνυμη κλάση επεκτείνει μία υφιστάμενη κλάση αντί για ένα inteface.
  
 +<code java HelloWorldAnonymousClasses.java>​
 +public class HelloWorldAnonymousClasses {
 +  ​
 +  interface HelloWorld {
 +    public void greet();
 +    public void greetSomeone(String someone);
 +  }
 +  ​
 +  public void sayHello() {
 +    ​
 +    class EnglishGreeting implements HelloWorld {
 +      String name = "​world";​
 +      public void greet() {
 +        greetSomeone("​world"​);​
 +      }
 +      public void greetSomeone(String someone) {
 +        name = someone;
 +        System.out.println("​Hello " + name);
 +      }
 +    }
 +    ​
 +    HelloWorld englishGreeting = new EnglishGreeting();​
 +    ​
 +    HelloWorld frenchGreeting = new HelloWorld() {
 +      String name = "tout le monde";​
 +      public void greet() {
 +        greetSomeone("​tout le monde"​);​
 +      }
 +      public void greetSomeone(String someone) {
 +        name = someone;
 +        System.out.println("​Salut " + name);
 +      }
 +    };
 +    ​
 +    HelloWorld spanishGreeting = new EnglishGreeting() {
 +      String name = "​mundo";​
 +      public void greet() {
 +        greetSomeone("​mundo"​);​
 +      }
 +      public void greetSomeone(String someone) {
 +        name = someone;
 +        System.out.println("​Hola,​ " + name);
 +      }
 +    };
 +    englishGreeting.greet();​
 +    frenchGreeting.greetSomeone("​Fred"​);​
 +    spanishGreeting.greet();​
 +  }
 +
 +  public static void main(String... args) {
 +    HelloWorldAnonymousClasses myApp =
 +      new HelloWorldAnonymousClasses();​
 +    myApp.sayHello();​
 +  }      ​
 +}
 +</​code>​
 +
 +Παρατηρήστε ότι η μεταβλητή //​frenchGreeting//​ προκύπτει από μία κλάση που υλοποιεί το inteface //​HelloWorld//​ η μεταβλητή //​spanishGreeting//​ προκύπτει ως επέκταση της κλάση //​EnglishGreeting//​.
 +
 +===== Πρόσβαση στις τοπικές μεταβλητές και στις μεταβλητές της εξωτερικής κλάσης =====
 +
 +Σε αναλογία με τις [[java:​local_inner_classes|τοπικές εμφωλευμένες κλάσεις]] οι ανώνυμες κλάσεις έχουν τις ίδιες δυνατότητες πρόσβασης στις τοπικές μεταβλήτές της μεθόδου στην οποία ορίζονται:​
 +  * Η ανώνυμη κλάση έχει πρόσβαση στις μεταβλητές της εξωτερικής κλάσης.
 +  * Η ανώνυμη κλάση δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές της μεθόδου στην οποία ορίζονται αν αυτές δεν έχουν δηλωθεί ως //final//.
 +  * Όπως σε όλες τις μη στατικές εμφωλευμένες κλάσεις ο ορισμός του ίδιου τύπου δεδομένων στην εσωτερική και την εξωτερική κλάση "//​κρύβει//"​ τον συγκεκριμένο τύπο δεδομένων από την εξωτερική κλάση.
 +  * Δεν μπορείτε να ορίσετε στατικές μεταβλητές ή μεθόδους μέσα σε μία ανώνυμη κλάση.
  
 +Σε μία ανώνυμη κλάση μπορείτε να ορίσετε τα εξής:
 +  * Πεδία
 +  * Επιπλέον μεθόδους που δεν ορίζονται στη interface ή στην κλάση που επεκτείνει.
 +  * Μεθόδους ή block αρχικοποίησης πεδίων της κλάσης.
 +  * Τοπικές κλάσεις που ανήκουν στη ανώνυμη κλάση.
 +  * **ΔΕΝ** μπορείτε και __δεν έχει νόημα__ να ορίσετε κατασκευαστές μέσα σε μία ανώνυμη κλάση.
java/anon_inner_classes.txt · Last modified: 2017/05/12 14:44 by gthanos