java:anon_inner_classes

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:anon_inner_classes [2015/04/30 16:05]
gthanos
java:anon_inner_classes [2017/05/12 14:44] (current)
gthanos
Line 1: Line 1:
-====== Ανώνυμές εμφωλευμένες κλάσεις ======+====== Ανώνυμες εμφωλευμένες κλάσεις ======
  
-Οι ανώνυμές εμφωλευμένες κλάσεις επιτρέπουν τον ταυτόχρονο ορισμό της υλοποίησης της κλάσης μαζί με την δημιουργία ενός αντικειμένου της κλάσης αυτής, σε μία εντολή. Οι κλάσεις αυτές ​χρησιμοποιούνται στην συγγραφή προγραμμάτων και πρέπει ​**α)** να υλοποιούν ένα υφιστάμενο ​interface ​ή **β)** να επεκτείνουν μία υφιστάμενη κλάση. Δείτε το παράδειγμα που παρουσιάστηκε στις μη στατικές εμφωλευμένες κλάσεις αλλαγμένο,​ ώστε να χρησιμοποιεί ανώνυμες κλάσεις +Οι ανώνυμές εμφωλευμένες κλάσεις επιτρέπουν τον ταυτόχρονο ορισμό της υλοποίησης της κλάσης μαζί με την δημιουργία ενός αντικειμένου της κλάσης αυτής, σε μία εντολή. Οι κλάσεις αυτές ​**ΠΡΕΠΕΙ** ​**α)** ​__να υλοποιούν ένα υφιστάμενο ​interface__ ​ή **β)** ​__να επεκτείνουν μία υφιστάμενη κλάση__. Δείτε το παράδειγμα που παρουσιάστηκε στις μη στατικές εμφωλευμένες κλάσεις αλλαγμένο,​ ώστε να χρησιμοποιεί ανώνυμες κλάσεις
- +
-<code java DataStructure.java>​ +
-public class DataStructure { +
-   +
-  // Create an array +
-  private final static int SIZE = 15; +
-  private int[] arrayOfInts = new int[SIZE];​ +
-   +
-  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 printEven() { +
-     +
-    // Print out values of even indices of the array +
-    DataStructureIterator iterator = new DataStructureIterator() { +
-      // Start stepping through the array from the beginning +
-      private int nextIndex = 0; +
-     +
-      public boolean hasNext() { +
-         +
-      // Check if the current element is the last in the array +
-      return (nextIndex <= SIZE - 1); +
-      }     +
-     +
-      public Integer next() { +
-       +
-      // Record a value of an even index of the array +
-      Integer retValue = Integer.valueOf(arrayOfInts[nextIndex]);​ +
-       +
-      // Get the next even element +
-      nextIndex += 2; +
-      return retValue; +
-      } +
-     +
-      public void remove() { } +
-     +
-    }; +
-    while (iterator.hasNext()) { +
-      System.out.print(iterator.next() + " "); +
-    } +
-    System.out.println();​ +
-  } +
-   +
-  public static void main(String s[]) { +
-    DataStructure ds = new DataStructure();​ +
-    ds.printEven();​ +
-  } +
-+
-</​code>​ +
- +
-Παρατηρήστε ότι η ορίζουμε μία νέα κλάση που υλοποιεί το interface //​DataStructureIterator//​ χωρίς να δώσουμε όνομα στην νέα κλάση (η κλάση προσδιορίζεται από τον τύπο δεδομένων που ορίζει το interface). Παράλληλα με τον ορισμό της κλάσης,​ δημιουργείται ένα νέο αντικείμενο,​ στο οποίο δείχνει η μεταβλητή //​iterator//​. Η συγκεκριμένη κλάση δημιουργήθηκε με βάση το inteface //​DataStructureIterator//​. Παρακάτω δίνεται ένα παράδειγμα όπου η ανώνυμη κλάση επεκτείνει μία υφιστάμενη κλάση.+
  
 <code java HelloWorldAnonymousClasses.java>​ <code java HelloWorldAnonymousClasses.java>​
- 
 public class HelloWorldAnonymousClasses { public class HelloWorldAnonymousClasses {
   ​   ​
Line 120: Line 62:
 Παρατηρήστε ότι η μεταβλητή //​frenchGreeting//​ προκύπτει από μία κλάση που υλοποιεί το inteface //​HelloWorld//​ η μεταβλητή //​spanishGreeting//​ προκύπτει ως επέκταση της κλάση //​EnglishGreeting//​. Παρατηρήστε ότι η μεταβλητή //​frenchGreeting//​ προκύπτει από μία κλάση που υλοποιεί το inteface //​HelloWorld//​ η μεταβλητή //​spanishGreeting//​ προκύπτει ως επέκταση της κλάση //​EnglishGreeting//​.
  
 +===== Πρόσβαση στις τοπικές μεταβλητές και στις μεταβλητές της εξωτερικής κλάσης =====
  
 +Σε αναλογία με τις [[java:​local_inner_classes|τοπικές εμφωλευμένες κλάσεις]] οι ανώνυμες κλάσεις έχουν τις ίδιες δυνατότητες πρόσβασης στις τοπικές μεταβλήτές της μεθόδου στην οποία ορίζονται:​
 +  * Η ανώνυμη κλάση έχει πρόσβαση στις μεταβλητές της εξωτερικής κλάσης.
 +  * Η ανώνυμη κλάση δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές της μεθόδου στην οποία ορίζονται αν αυτές δεν έχουν δηλωθεί ως //final//.
 +  * Όπως σε όλες τις μη στατικές εμφωλευμένες κλάσεις ο ορισμός του ίδιου τύπου δεδομένων στην εσωτερική και την εξωτερική κλάση "//​κρύβει//"​ τον συγκεκριμένο τύπο δεδομένων από την εξωτερική κλάση.
 +  * Δεν μπορείτε να ορίσετε στατικές μεταβλητές ή μεθόδους μέσα σε μία ανώνυμη κλάση.
  
- +Σε μία ανώνυμη κλάση μπορείτε να ορίσετε τα εξής: 
 +  * Πεδία 
 +  * Επιπλέον μεθόδους που δεν ορίζονται στη interface ή στην κλάση που επεκτείνει. 
 +  * Μεθόδους ή block αρχικοποίησης πεδίων της κλάσης. 
 +  * Τοπικές κλάσεις που ανήκουν στη ανώνυμη κλάση. 
 +  * **ΔΕΝ** μπορείτε και __δεν έχει νόημα__ να ορίσετε κατασκευαστές μέσα σε μία ανώνυμη κλάση.
java/anon_inner_classes.1430409952.txt.gz · Last modified: 2016/02/26 11:15 (external edit)