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
Last revision Both sides next revision
java:inner_classes [2017/05/12 14:20]
gthanos removed
java:inner_classes [2017/05/12 14:22]
gthanos created
Line 1: Line 1:
-====== ​Δημιουργία αντικειμένων της ​εσωτερικής κλάσης ======+====== ​Μη στατικές εμφωλευμένες κλάσεις ======
  
-===== Δημιουργία αντικειμένων της ​εσωτερικής κλάσης στην εξωτερική κλάση ​=====+Οι μη στατικές εμφωλευμένες κλάσεις ή εσωτερικές κλάσεις (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]]. ​
  
-Απαραίτητη προϋπόθεση για να δημιουργηθεί ένα αντικείμενο της εσωτερικής κλάσης είναι να υπάρχει ένα αντικείμενο της εξωτερικής κλάσης. Δεν μπορείτε να έχετε δηλαδή οποιαδήποτε αντικείμενο της εσωτερικής κλάσης χωρίς αυτό να συνδυαστεί με ένα αντικείμενο της εξωτερικής κλάσης. 
  
-Δείτε το παρακάτω παράδειγμα δημιουργίας ενός αντικειμένου της εσωτερικής κλάσης μέσα στον κατασκευαστή της εξωτερικής κλάσης +|Προηγούμενο:​ [[ :java:nested_classesΕμφωλευμένες κλάσεις ​ ]] |  [[:​toc|Περιεχόμενα]] ​ |Επόμενο:​ [[ :java:inner_class_objects ​Δημιουργία αντικειμένων της εσωτερικής κλάσης ]]|
- +
-<code java OuterClass.java>​ +
-public class OuterClass { +
- +
-  int outerClassField;​ +
-  InnerClass ic; +
- +
-  public OuterClass(int field) { +
-    outerClassField = field; +
-    ic = new InnerClass(field*2);​ +
-  } +
-   +
-  class InnerClass { +
-    int innerClassField;​ +
-     +
-    public InnerClass(int field) { +
-      innerClassField = field; +
-    } +
-  } +
-   +
-  public String toString() { +
-    return "​outerClassField:​ "​+outerClassField+",​ innerClassField:​ "​+ic.innerClassField;​ +
-  } +
-   +
-  public static void main(String []args) { +
-    OuterClass outer = new OuterClass(10);​ +
-    System.out.println(outer);​ +
-  }   +
-+
- +
-</​code>​ +
- +
-===== Δημιουργία αντικειμένων της εσωτερικής κλάσης από άλλες κλάσεις ή στατικές μεθόδους ===== +
- +
-Προηγούμενα αναφέρθηκε ότι για να δημιουργηθεί ένα αντικείμενο της εσωτερικής κλάσης θα πρέπει να υπάρχει ένα αντικείμενο της εξωτερικής κλάσης. Δείτε πως μπορείτε να δημιουργήσετε σε μία στατική μέθοδο (//όπως είναι η μέθοδος **main**//) ένα αντικείμενο της εσωτερικής κλάσης με βάση την εξωτερική κλάση. +
- +
-<code java OuterClass.java>​ +
-public class OuterClass { +
-  int outerClassField;​ +
-  InnerClass ic; +
- +
-  public OuterClass(int field) { +
-    outerClassField = field; +
-    ic = new InnerClass(field*2);​ +
-  } +
-   +
-  class InnerClass { +
-    int innerClassField;​ +
-     +
-    public InnerClass(int field) { +
-      innerClassField = field; +
-    } +
-     +
-    public String toString() { +
-      return "​[innerClassField:​ "​+innerClassField+"​]";​ +
-    } +
-  } +
-   +
-  public String toString() { +
-    return "​outerClassField:​ "​+outerClassField+"​ "​+ic.toString();​ +
-  } +
-+
- +
-class TestOuterClass { +
-  public static void main(String []args) { +
-    OuterClass outer = new OuterClass(10);​ +
-    System.out.println(outer);​ +
-    OuterClass.InnerClass inner = outer.new InnerClass(4);​ +
-    System.out.println(inner.toString());​ +
-  } +
-+
- +
-</​code>​ +
- +
-Αρχικά,​ δημιουργούμε ένα αντικείμενο της κλάσης **OuterClass**. Στη συνέχεια με δεδομένο ότι έχουμε δημιουργήσει το αντικείμενο τύπου **OuterClass** στο οποίο δείχνει η μεταβλητή //outer// δημιουργούμε ένα νέο αντικείμενο της εσωτερικής κλάσης,​ όπως παρακάτω. Παρατηρήστε την ιδιαίτερη σύνταξη δημιουργίας αντικειμένων της εσωτερικής κλάσης.  +
-<code java> +
-  OuterClass.InnerOuterClass inner = outer.new InnerOuterClass(4);​ +
-</​code>​ +
- +
-<WRAP todo 80% round center>​ +
-Είναι προφανές ότι μπορούμε να φτιάξουμε πολλαπλά αντικείμενα της εσωτερικής κλάσης,​ με την προϋπόθεση ότι έχουμε τουλάχιστον ένα αντικείμενο της εξωτερικής κλάσης. Τι γίνεται όμως αν παραλείψετε να αρχικοποιήσετε την μεταβλητή της γονικής κλάσης,​ όπως παρακάτω:​ +
-<code java TestOuterClass.java>​ +
-public class TestOuterClass { +
-  public static void mian(String args[]) { +
-    OuterClass outer; ​                                               //line 3 +
-    OuterClass.InnerOuterClass inner = outer.new InnerOuterClass(4);​ //line 4 +
-  } +
-+
-</​code>​ +
-Σε αυτή την περίπτωση λαμβάνετε από τον μεταγλωττιστή ένα μήνυμα λάθους της μορφής +
-<​code>​ +
-OuterClass.java:​29:​ error: variable outer might not have been initialized +
-    OuterClass.InnerClass inner = outer.new InnerClass(4);​ //line 4 +
-                                  ^ +
-1 error +
-</​code>​ +
-Δοκιμάστε το. +
-</​WRAP>​ +
- +
-Οι εσωτερικές κλάσεις μπορούν να έχουν προσδιοριστές πρόσβασης (//public, protected, package-private,​ private//) όπως και τα πεδία της κλάσης. Θα εξηγήσουμε αναλυτικά στη συνέχεια τη σημασία των προσδιοριστών πρόσβασης για τις εσωτερικές κλάσεις. +
- +
-| Προηγούμενο : [[ :java:inner_classes ​Μη στατικές εμφωλευμένες κλάσεις ​ ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :java:inner_class_access ​Προσβασιμότητα πεδίων και μεθόδων μεταξύ ​εσωτερικής και εξωτερικής κλάσης ]]  |+
java/inner_classes.txt · Last modified: 2017/05/12 14:45 by gthanos