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/02/06 11:16]
gthanos
java:inner_classes [2019/04/02 20:20]
gthanos
Line 1: Line 1:
 ====== Μη στατικές εμφωλευμένες κλάσεις ====== ====== Μη στατικές εμφωλευμένες κλάσεις ======
  
-Οι μη στατικές εμφωλευμένες κλάσεις ή εσωτερικές κλάσεις (inner classes) αποτελούν την γενικότερη περίπτωση εμφώλευσης μίας κλάσης μέσα σε μία άλλη κλάση. Δείτε το παρακάτω παράδειγμα απεικόνισης των ζυγών στοιχείων ενός πίνακα 15 στοιχείων με χρήση μίας εσωτερικής κλάσης η οποία υλοποιεί το interface [[https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html|Iterator]]:+Οι μη στατικές εμφωλευμένες κλάσεις ή εσωτερικές κλάσεις (inner classes) αποτελούν την γενικότερη περίπτωση εμφώλευσης μίας κλάσης μέσα σε μία άλλη κλάση. Ας υποθέσουμε ότι θέλουμε να κατασκευάσουμε μία διπλά συνδεδεμένη λίστα η οποία μπορεί να αποθηκεύσει οποιονδήποτε τύπο όμοιων αντικειμένων. 
 +Η λίστα θα χρειαστεί να έχει δύο βοηθητικές κλάσεις  
 +  - την κλάση που περιγράφει τον κόμβο της λίστας και  
 +  - μία κλάση τύπου //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]]. Δείτε τον παρακάτω κώδικα που την υλοποιεί.
  
-<code java DataStructure.java> +<code java LinkedList.java> 
-public class DataStructure {+public class LinkedList<E> { 
 +  private Node<E> head, tail;
      
-  // Create an array +  public LinkedList() { 
-  private final static int SIZE 15+    head new Node<>(null, null, null)
-  private int[] arrayOfInts = new int[SIZE];+    tail = new Node<>(null, head, null); 
 +    head.setNext(tail); 
 +  }
      
-  public DataStructure() +  private class Node<E> 
-    // fill the array with ascending integer values +    private Node<E> next, prev; 
-    for (int i = 0SIZE; i++) { +    private E e; 
-      arrayOfInts[i] i;+   
 +    public Node(Node<E> nxt, Node<E> prv, E elem) { 
 +      next = nxt; 
 +      prev = prv; 
 +      e elem;
     }     }
 +    
 +    public Node<E> getNext() {return next;}
 +    public void setNext(Node<E> nxt) { next = nxt; }
 +    public Node<E> getPrev() {return prev;}
 +    public void setPrev(Node<E> prv) { prev = prv; }
 +    public E getElement() { return e; }
 +    public void setElement(E elem) { e = elem; }
   }   }
      
-  public void printEven() { +  private class Iterator<E> implements java.util.Iterator<E>
-     +    Node<E> curr; 
-    // Print out values of even indices of the array +    public Iterator(Node<E> c) { 
-    DataStructureIterator iterator this.new EvenIterator(); +      curr = c; 
-    while (iterator.hasNext()) { +    } 
-      System.out.print(iterator.next() + " ");+    public boolean hasNext() { 
 +      if(curr.getNext() != tail) 
 +        return true; 
 +      return false; 
 +    
 +    public E next() { 
 +      curr curr.getNext(); 
 +      return curr.getElement(); 
 +    
 +    public void remove() { 
 +      curr.getPrev().setNext(curr.getNext()); 
 +      curr.getNext().setPrev(curr.getPrev())
 +      curr = null;
     }     }
-    System.out.println(); 
   }   }
      
-  interface DataStructureIterator extends java.util.Iterator<Integer> {  +  Iterator<Eiterator() 
- +    return new Iterator<E>(head); 
-  // Inner class implements the DataStructureIterator interface, +  }
-  // which extends the Iterator<Integerinterface+
      
-  private class EvenIterator implements DataStructureIterator { +  // append in the end 
-     +  public void add(E elem) { 
-    // Start stepping through the array from the beginning +    Node<E> plus new Node<E>(tail, tail.getPrev(), elem)
-    private int nextIndex 0+    tail.getPrev().setNext(plus); 
-     +    tail.setPrev(plus); 
-    public boolean hasNext() { +  } 
-       +   
-      // Check if the current element is the last in the array +  public boolean contains(E elem) { 
-      return (nextIndex <= SIZE - 1); +    Iterator<E> it iterator(); 
-    }     +    while(it.hasNext()) { 
-     +      E e it.next(); 
-    public Integer next() { +      if( e.equals(elem) ) 
-       +        return true;
-      // 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;+
     }     }
-     +    return false;
-    public void remove() { }+
   }   }
      
-  public static void main(String s[]) { +  public int indexOf(E elem) { 
-     +    Iterator<E> it = iterator(); 
-    // Fill the array with integer values and print out only +    int index = -1; 
-    // values of even indices +    while(it.hasNext()) { 
-    DataStructure ds new DataStructure(); +      E e = it.next(); 
-    ds.printEven();+      index++; 
 +      if( e.equals(elem) ) 
 +        return index; 
 +    } 
 +    return -1; 
 +  } 
 +
 +</code> 
 + 
 +Το παρακάτω πρόγραμμα επιχειρεί να δημιουργήσει μία λίστα με 20 τυχαίους αριθμούς και στη συνέχεια να τους εκτυπώσει χρησιμοποιώντας τον Iterator της λίστας. Παρατηρήστε ότι σε κανένα σημείου του προγράμματος δεν αποκαλύπτεται η ύπαρξη των εσωτερικών κλάσεων //Node// και //Iterator//. Η μεταβλητή //it// παραπέμπει στο interface [[http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html|java.util.Iterator]]. 
 + 
 +<code java LinkedListUsage.java> 
 +import java.util.*; 
 + 
 +public class LinkedListUsage { 
 +  public static final int SIZE = 20; 
 +   
 +  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(8*SIZE)); 
 +    
 +    Iterator<Integer> it list.iterator(); 
 +    while(it.hasNext()) { 
 +      System.out.print(it.next()+"  "); 
 +    } 
 +    System.out.println();
   }   }
 } }
 </code> </code>
  
-<WRAP todo center 80% round> Σε αναλογία, δημιουργήστε την εσωτερική κλάση **OddIterator** και τη μέθοδο **printOdd()** για την εκτύπωση των μονών αριθμών του πίνακα+<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| Εμφωλευμένες κλάσεις  ]] | Επόμενο: [[ :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)