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
java:anon_inner_classes [2015/04/30 15:55]
gthanos created
java:anon_inner_classes [2017/05/12 14:44] (current)
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 αρχικοποίησης πεδίων της κλάσης.
 +  * Τοπικές κλάσεις που ανήκουν στη ανώνυμη κλάση.
 +  * **ΔΕΝ** μπορείτε και __δεν έχει νόημα__ να ορίσετε κατασκευαστές μέσα σε μία ανώνυμη κλάση.
java/anon_inner_classes.1430409323.txt.gz · Last modified: 2016/02/26 11:15 (external edit)