====== Κληρονομικότητα εσωτερικών κλάσεων ======
===Η συγκεκριμένη ενότητα είναι προαιρετική και μπορείτε να την παραλήψετε κατά την ανάγνωση της θεωρείας του μαθήματος.===
Η εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις που ανήκουν στην ίδια εξωτερική κλάση ή εξωτερικές κλάσεις. Δείτε το παρακάτω παράδειγμα κληρονομικότητας εσωτερικών κλάσεων.
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
Είδαμε ότι οι εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις που ανήκουν στην ίδια εξωτερική
κλάση ή εξωτερικές κλάσεις.
===== Κληρονομικότητα εσωτερικών κλάσεων από εσωτερικές κλάσεις άλλων εξωτερικών κλάσεων =====
Οι εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις άλλων εξωτερικών κλάσεων μόνο εάν η ιδιότητα της κληρονομικότητας ισχύει τόσο σε επίπεδο εσωτερικών όσο και σε επίπεδο εξωτερικών κλάσεων. Δείτε το παρακάτω παράδειγμα που αποτελεί επέκταση του προηγούμενου.
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_access | Προσβασιμότητα πεδίων και μεθόδων μεταξύ εσωτερικής και εξωτερικής κλάσης ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:local_inner_classes | Τοπικές εμφωλευμένες κλάσεις ]] |