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