This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
java:inner_classes [2017/04/02 23:44] gthanos |
java:inner_classes [2021/04/12 04:31] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Μη στατικές εμφωλευμένες κλάσεις ====== | ||
| - | Οι μη στατικές εμφωλευμένες κλάσεις ή εσωτερικές κλάσεις (inner classes) αποτελούν την γενικότερη περίπτωση εμφώλευσης μίας κλάσης μέσα σε μία άλλη κλάση. Ας υποθέσουμε ότι θέλουμε να κατασκευάσουμε μία διπλά συνδεδεμένη λίστα η οποία μπορεί να αποθηκεύσει οποιονδήποτε τύπο όμοιων αντικειμένων. | ||
| - | Η λίστα θα χρειαστεί να έχει δύο βοηθητικές κλάσεις | ||
| - | - την κλάση που περιγράφει τον κόμβο της λίστας και | ||
| - | - μία κλάση τύπου iterator για την διάτρεξη της λίστας | ||
| - | Οι δύο παραπάνω κλάσεις εξυπηρετεί να δηλωθούν ως εσωτερικές κλάσεις αποκρύπτοντας την υλοποίηση των κλάσεων αυτών. Το παραπάνω επιτρέπει η λίστα να είναι συμβατή με τα interfaces [[http:// | ||
| - | |||
| - | <code java LinkedList.java> | ||
| - | public class LinkedList< | ||
| - | private Node< | ||
| - | | ||
| - | public LinkedList() { | ||
| - | head = new Node<> | ||
| - | tail = new Node<> | ||
| - | head.setNext(tail); | ||
| - | } | ||
| - | | ||
| - | private class Node< | ||
| - | private Node< | ||
| - | private E e; | ||
| - | | ||
| - | public Node(Node< | ||
| - | next = nxt; | ||
| - | prev = prv; | ||
| - | e = elem; | ||
| - | } | ||
| - | | ||
| - | public Node< | ||
| - | public void setNext(Node< | ||
| - | public Node< | ||
| - | public void setPrev(Node< | ||
| - | public E getElement() { return e; } | ||
| - | public void setElement(E elem) { e = elem; } | ||
| - | } | ||
| - | | ||
| - | private class Iterator< | ||
| - | Node< | ||
| - | public Iterator(Node< | ||
| - | curr = c; | ||
| - | } | ||
| - | 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; | ||
| - | } | ||
| - | } | ||
| - | | ||
| - | Iterator< | ||
| - | return new Iterator< | ||
| - | } | ||
| - | | ||
| - | // append in the end | ||
| - | public void add(E elem) { | ||
| - | Node< | ||
| - | tail.getPrev().setNext(plus); | ||
| - | tail.setPrev(plus); | ||
| - | } | ||
| - | | ||
| - | public boolean contains(E elem) { | ||
| - | Iterator< | ||
| - | while(it.hasNext()) { | ||
| - | E e = it.next(); | ||
| - | if( e.equals(elem) ) | ||
| - | return true; | ||
| - | } | ||
| - | return false; | ||
| - | } | ||
| - | | ||
| - | public int indexOf(E elem) { | ||
| - | Iterator< | ||
| - | int index = -1; | ||
| - | while(it.hasNext()) { | ||
| - | E e = it.next(); | ||
| - | index++; | ||
| - | if( e.equals(elem) ) | ||
| - | return index; | ||
| - | } | ||
| - | return -1; | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Το παρακάτω πρόγραμμα επιχειρεί να δημιουργήσει μία λίστα με 20 τυχαίους αριθμούς και στη συνέχεια να τους εκτυπώσει χρησιμοποιώντας τον Iterator της λίστας. Παρατηρήστε ότι σε κανένα σημείου του προγράμματος δεν αποκαλύπτεται η ύπαρξη των εσωτερικών κλάσεων //Node// και // | ||
| - | |||
| - | <WRAP todo center 80% round> Επιχειρήσετε να συμπληρώσετε την κλάση LinkedList ώστε να ικανοποιεί το interface [[http:// | ||
| - | </ | ||
| - | |||
| - | |||
| - | |Προηγούμενο: | ||