User Tools

Site Tools


java:inner_class_inheritance

Κληρονομικότητα εσωτερικών κλάσεων

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

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

InnerClassInheritance.java
class OuterClass {
  int outer;
  InnerClass innerObj;
 
  public OuterClass(int o) {
    outer = o;
    innerObj = new InnerClass(2*o);
  }  
 
  public String toString() {
    return "outer (int): "+ outer + ", innerObj: "+innerObj;
  }
 
  class InnerClass {
    private int innerPriv;    
    public InnerClass(int p) { innerPriv = p; }
    public final void setInnerPriv(int p) { innerPriv = p; }
    public String toString() {
      return "innerPriv: "+innerPriv; 
    }
  }
 
  class InnerInnerClass extends InnerClass {
    public InnerInnerClass(int p) { super(2*p); }
  }
 
  public static void main(String [] args) {
    OuterClass outer = new OuterClass(2);
    OuterClass.InnerClass inner = outer.new InnerClass(10);
    OuterClass.InnerInnerClass innerInner = outer.new InnerInnerClass(10);
 
    System.out.println(outer);
    System.out.println(inner);
    System.out.println(innerInner);
  } 
}

Παρατηρήστε ότι το πρόγραμμα μεταγλωττίζεται κανονικά και εκτυπώνει το παρακάτω:

$> java InnerClassInheritance 
outer (int): 2, innerObj: innerPriv: 4
innerPriv: 10
innerPriv: 20

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

Κληρονομικότητα εσωτερικών κλάσεων από εσωτερικές κλάσεις άλλων εξωτερικών κλάσεων

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

InnerClassInheritance2.java
class OuterClass {
  int outer;
  InnerClass innerObj;
 
  public OuterClass(int o) {
    outer = o;
    innerObj = new InnerClass(2*o);
  }  
 
  public String toString() {
    return "outer (int): "+ outer + ", innerObj: "+innerObj;
  }
 
  class InnerClass {
    private int innerPriv;    
    public InnerClass(int p) { innerPriv = p; }
    public final void setInnerPriv(int p) { innerPriv = p; }
    public String toString() {
      return "innerPriv: "+innerPriv; 
    }
  }
 
  class InnerInnerClass extends InnerClass {
    public InnerInnerClass(int p) { super(2*p); }
  }
 
  class OuterInnerClass extends OuterClass {
    public OuterInnerClass(int o) {
      super(o);
    }
  }
 
  public static void main(String [] args) {
    OuterClass outer = new OuterClass(2);
    OuterClass.InnerClass inner = outer.new InnerClass(10);
    OuterClass.InnerInnerClass innerInner = outer.new InnerInnerClass(10);
 
    System.out.println(outer);
    System.out.println(inner);
    System.out.println(innerInner);
  }
}
 
class AnotherOuterClass extends OuterClass {
 
  public AnotherOuterClass(int p) {
    super(p);
  }
 
  class AnotherInnerClass extends OuterClass.InnerClass {
    public AnotherInnerClass(int p) {
      super(p);
    }
  }
}

Εάν στο παραπάνω παράδειγμα αφαιρέσετε την κληρονομικότητα μεταξύ των κλάσεων AnotherOuterClass –> OuterClass τότε ο μεταγλώττιστης εμφανίζει το παρακάτω μήνυμα λάθους.

$> javac InnerClassInheritance.java 
InnerClassInheritance.java:50: error: an enclosing instance that contains OuterClass.InnerClass is required
      super(p);
      ^
1 error
java/inner_class_inheritance.txt · Last modified: 2020/03/23 09:06 by gthanos