java: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
Next revision Both sides next revision
java:inner_classes [2017/04/02 23:44]
gthanos
java:inner_classes [2020/03/23 08:40]
gthanos
Line 1: Line 1:
 ====== Μη στατικές εμφωλευμένες κλάσεις ====== ====== Μη στατικές εμφωλευμένες κλάσεις ======
  
-Οι μη στατικές εμφωλευμένες κλάσεις ή εσωτερικές κλάσεις (inner classes) αποτελούν την γενικότερη περίπτωση εμφώλευσης μίας κλάσης μέσα σε μία άλλη κλάση. Ας υποθέσουμε ότι θέλουμε να κατασκευάσουμε μία διπλά συνδεδεμένη λίστα η οποία μπορεί να αποθηκεύσει οποιονδήποτε τύπο όμοιων αντικειμένων. +Οι μη στατικές εμφωλευμένες κλάσεις ή εσωτερικές κλάσεις (inner classes) αποτελούν την γενικότερη περίπτωση εμφώλευσης μίας κλάσης μέσα σε μία άλλη κλάση. Ένας συνήθης λόγος (αλλα όχι ο μοναδικός) για τον οποίο επιδιώκουμε να χρησιμοποιήσουμε εμφωλευμένες κλάσεις είναι όταν θέλουμε να ορίσουμε επιπλέον κλάσεις των οποίων δεν θέλουμε ή δεν έχουμε λόγο να αποκαλύψουμε ότι υπάρχουν. Για παράδειγμα, ας υποθέσουμε ότι θέλουμε να κατασκευάσουμε μία διπλά συνδεδεμένη λίστα η οποία μπορεί να αποθηκεύσει οποιονδήποτε τύπο όμοιων αντικειμένων. 
-Η λίστα θα χρειαστεί να έχει δύο βοηθητικές κλάσεις +Η λίστα θα χρειαστεί να έχει τις βοηθητικές κλάσεις 
   - την κλάση που περιγράφει τον κόμβο της λίστας και    - την κλάση που περιγράφει τον κόμβο της λίστας και 
-  - μία κλάση τύπου iterator για την διάτρεξη της λίστας +  - μία κλάση τύπου //iterator// για την διάτρεξη της λίστας 
-Οι δύο παραπάνω κλάσεις εξυπηρετεί να δηλωθούν ως εσωτερικές κλάσεις αποκρύπτοντας την υλοποίηση των κλάσεων αυτών. Το παραπάνω επιτρέπει η λίστα να είναι συμβατή με τα interfaces [[http://docs.oracle.com/javase/8/docs/api/java/util/List.html|java.util.List]] και [[http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html|java.util.Iterator]]. Δείτε τον παρακάτω κώδικα που την υλοποιεί.+Οι δύο παραπάνω κλάσεις εξυπηρετεί να δηλωθούν ως εσωτερικές κλάσεις αποκρύπτοντας την ύπαρξη τους. Ο χρήστης της κλάσης απαιτείται μόνο να γνωρίζει την κλάση της λίστας και πως μπορεί να διαχειριστεί ένα αντικείμενο τύπου [[http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html|java.util.Iterator]]. Όλα τα υπόλοιπα είναι λεπτομέρειες τα οποία δεν αφορούν τον προγραμματιστή-χρήστη της κλάσης.  
 + 
 +Δείτε τον παρακάτω κώδικα που την υλοποιεί.
  
 <code java LinkedList.java> <code java LinkedList.java>
 +
 +/* A linked list with sentinels at head and tail.
 + */
 public class LinkedList<E> { public class LinkedList<E> {
   private Node<E> head, tail;   private Node<E> head, tail;
Line 27: Line 32:
     }     }
          
-    public Node<E> getNext() {return next;}+    public Node<E> getNext() { return next;}
     public void setNext(Node<E> nxt) { next = nxt; }     public void setNext(Node<E> nxt) { next = nxt; }
     public Node<E> getPrev() {return prev;}     public Node<E> getPrev() {return prev;}
Line 35: Line 40:
   }   }
      
-  private class Iterator<E> implements java.util.Iterator {+  private class Iterator<E> implements java.util.Iterator<E> {
     Node<E> curr;     Node<E> curr;
 +    
     public Iterator(Node<E> c) {     public Iterator(Node<E> c) {
       curr = c;       curr = c;
Line 52: Line 58:
       curr.getPrev().setNext(curr.getNext());       curr.getPrev().setNext(curr.getNext());
       curr.getNext().setPrev(curr.getPrev());       curr.getNext().setPrev(curr.getPrev());
-      curr = null;+      curr = curr.getPrev();
     }     }
   }   }
Line 93: Line 99:
 Το παρακάτω πρόγραμμα επιχειρεί να δημιουργήσει μία λίστα με 20 τυχαίους αριθμούς και στη συνέχεια να τους εκτυπώσει χρησιμοποιώντας τον Iterator της λίστας. Παρατηρήστε ότι σε κανένα σημείου του προγράμματος δεν αποκαλύπτεται η ύπαρξη των εσωτερικών κλάσεων //Node// και //Iterator//. Η μεταβλητή //it// παραπέμπει στο interface [[http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html|java.util.Iterator]]. Το παρακάτω πρόγραμμα επιχειρεί να δημιουργήσει μία λίστα με 20 τυχαίους αριθμούς και στη συνέχεια να τους εκτυπώσει χρησιμοποιώντας τον Iterator της λίστας. Παρατηρήστε ότι σε κανένα σημείου του προγράμματος δεν αποκαλύπτεται η ύπαρξη των εσωτερικών κλάσεων //Node// και //Iterator//. Η μεταβλητή //it// παραπέμπει στο interface [[http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html|java.util.Iterator]].
  
-<WRAP todo center 80% round> Επιχειρήσετε να συμπληρώσετε την κλάση LinkedList ώστε να ικανοποιεί το interface [[http://docs.oracle.com/javase/8/docs/api/java/util/List.html|java.util.List]].+<code java LinkedListUsage.java> 
 +import java.util.*; 
 + 
 +public class LinkedListUsage { 
 +  public static final int SIZE = 16; 
 +  public static final int RANGE = 8 * SIZE; 
 +   
 +  public static void main(String[] args) { 
 +    Random rand = new Random( new Date().getTime()); 
 +    LinkedList<Integer> list = new LinkedList<>(); 
 +    for(int i=0; i<SIZE; i++) { 
 +      list.add(rand.nextInt(RANGE)); 
 +    } 
 +    Iterator<Integer> it = list.iterator(); 
 +     
 +    // Print list 
 +    while(it.hasNext()) { 
 +      System.out.print(it.next()+"  "); 
 +    } 
 +    System.out.println(); 
 +     
 +    // Remove all elements less than RANGE/2 
 +    System.out.println("Remove values < "+RANGE/2); 
 +    it = list.iterator(); 
 +    while(it.hasNext()) { 
 +      int value = it.next(); 
 +      //System.out.println("value: "+value); 
 +      if(value < RANGE/2) { 
 +        //System.out.println("RMV: "+value); 
 +        it.remove(); 
 +      } 
 +    } 
 +     
 +    // Print list 
 +    it = list.iterator(); 
 +    while(it.hasNext()) { 
 +      System.out.print(it.next()+"  "); 
 +    } 
 +    System.out.println(); 
 +  } 
 +
 + 
 +</code> 
 + 
 +<WRAP todo center 80% round> **Εργασία για το σπίτι:** Επιχειρήσετε να συμπληρώσετε την κλάση LinkedList ώστε να ικανοποιεί το interface [[http://docs.oracle.com/javase/8/docs/api/java/util/List.html|java.util.List]].
 </WRAP> </WRAP>
  
  
 |Προηγούμενο: [[ :java:nested_classes| Εμφωλευμένες κλάσεις  ]] |  [[:toc|Περιεχόμενα]]  |Επόμενο: [[ :java:inner_class_objects | Δημιουργία αντικειμένων της εσωτερικής κλάσης ]]| |Προηγούμενο: [[ :java:nested_classes| Εμφωλευμένες κλάσεις  ]] |  [[:toc|Περιεχόμενα]]  |Επόμενο: [[ :java:inner_class_objects | Δημιουργία αντικειμένων της εσωτερικής κλάσης ]]|
java/inner_classes.txt · Last modified: 2021/04/12 04:31 (external edit)