java:inner_class_objects

Δημιουργία αντικειμένων της εσωτερικής κλάσης

Δημιουργία αντικειμένων της εσωτερικής κλάσης στην εξωτερική κλάση

Απαραίτητη προϋπόθεση για να δημιουργηθεί ένα αντικείμενο της εσωτερικής κλάσης είναι να υπάρχει ένα αντικείμενο της εξωτερικής κλάσης. Δεν μπορείτε να έχετε δηλαδή οποιαδήποτε αντικείμενο της εσωτερικής κλάσης χωρίς αυτό να συνδυαστεί με ένα αντικείμενο της εξωτερικής κλάσης.

Δείτε το παρακάτω παράδειγμα δημιουργίας ενός αντικειμένου της εσωτερικής κλάσης μέσα στον κατασκευαστή της εξωτερικής κλάσης

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);
  }  
}

Δημιουργία αντικειμένων της εσωτερικής κλάσης από άλλες κλάσεις ή στατικές μεθόδους

Προηγούμενα αναφέρθηκε ότι για να δημιουργηθεί ένα αντικείμενο της εσωτερικής κλάσης θα πρέπει να υπάρχει ένα αντικείμενο της εξωτερικής κλάσης. Δείτε πως μπορείτε να δημιουργήσετε σε μία στατική μέθοδο (όπως είναι η μέθοδος main) ένα αντικείμενο της εσωτερικής κλάσης με βάση την εξωτερική κλάση.

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());
  }
}

Αρχικά, δημιουργούμε ένα αντικείμενο της κλάσης OuterClass. Στη συνέχεια με δεδομένο ότι έχουμε δημιουργήσει το αντικείμενο τύπου OuterClass στο οποίο δείχνει η μεταβλητή outer δημιουργούμε ένα νέο αντικείμενο της εσωτερικής κλάσης, όπως παρακάτω. Παρατηρήστε την ιδιαίτερη σύνταξη δημιουργίας αντικειμένων της εσωτερικής κλάσης.

  OuterClass.InnerOuterClass inner = outer.new InnerOuterClass(4);

Είναι προφανές ότι μπορούμε να φτιάξουμε πολλαπλά αντικείμενα της εσωτερικής κλάσης, με την προϋπόθεση ότι έχουμε τουλάχιστον ένα αντικείμενο της εξωτερικής κλάσης. Τι γίνεται όμως αν παραλείψετε να αρχικοποιήσετε την μεταβλητή της γονικής κλάσης, όπως παρακάτω:

TestOuterClass.java
public class TestOuterClass {
  public static void mian(String args[]) {
    OuterClass outer;                                                //line 3
    OuterClass.InnerOuterClass inner = outer.new InnerOuterClass(4); //line 4
  }
}

Σε αυτή την περίπτωση λαμβάνετε από τον μεταγλωττιστή ένα μήνυμα λάθους της μορφής

OuterClass.java:29: error: variable outer might not have been initialized
    OuterClass.InnerClass inner = outer.new InnerClass(4); //line 4
                                  ^
1 error

Δοκιμάστε το.

Οι εσωτερικές κλάσεις μπορούν να έχουν προσδιοριστές πρόσβασης (public, protected, package-private, private) όπως και τα πεδία της κλάσης. Θα εξηγήσουμε αναλυτικά στη συνέχεια τη σημασία των προσδιοριστών πρόσβασης για τις εσωτερικές κλάσεις.

java/inner_class_objects.txt · Last modified: 2017/05/12 14:20 by gthanos