java:inner_class_inheritance
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
java:inner_class_inheritance [2017/02/03 14:25] – created gthanos | java:inner_class_inheritance [2020/03/23 09:06] (current) – [Κληρονομικότητα εσωτερικών κλάσεων από εσωτερικές κλάσεις άλλων εξωτερικών κλάσεων] gthanos | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | |||
====== Κληρονομικότητα εσωτερικών κλάσεων ====== | ====== Κληρονομικότητα εσωτερικών κλάσεων ====== | ||
+ | |||
+ | <WRAP important 70% center round> | ||
+ | ===Η συγκεκριμένη ενότητα είναι προαιρετική και μπορείτε να την παραλήψετε κατά την ανάγνωση της θεωρείας του μαθήματος.=== | ||
+ | </ | ||
Η εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις που ανήκουν στην ίδια εξωτερική κλάση ή εξωτερικές κλάσεις. Δείτε το παρακάτω παράδειγμα κληρονομικότητας εσωτερικών κλάσεων. | Η εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις που ανήκουν στην ίδια εξωτερική κλάση ή εξωτερικές κλάσεις. Δείτε το παρακάτω παράδειγμα κληρονομικότητας εσωτερικών κλάσεων. | ||
<code java InnerClassInheritance.java> | <code java 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: " | ||
+ | } | ||
+ | | ||
+ | class InnerClass { | ||
+ | private int innerPriv; | ||
+ | public InnerClass(int p) { innerPriv = p; } | ||
+ | public final void setInnerPriv(int p) { innerPriv = p; } | ||
+ | public String toString() { | ||
+ | return " | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | 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 | ||
+ | </ | ||
+ | |||
+ | Είδαμε ότι οι εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις που ανήκουν στην ίδια εξωτερική | ||
+ | κλάση ή εξωτερικές κλάσεις. | ||
+ | |||
+ | ===== Κληρονομικότητα εσωτερικών κλάσεων από εσωτερικές κλάσεις άλλων εξωτερικών κλάσεων ===== | ||
+ | |||
+ | Οι εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις άλλων εξωτερικών κλάσεων μόνο εάν η ιδιότητα της κληρονομικότητας ισχύει τόσο σε επίπεδο εσωτερικών όσο και σε επίπεδο εξωτερικών κλάσεων. Δείτε το παρακάτω παράδειγμα που αποτελεί επέκταση του προηγούμενου. | ||
+ | |||
+ | <code java 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: " | ||
+ | } | ||
+ | | ||
+ | class InnerClass { | ||
+ | private int innerPriv; | ||
+ | public InnerClass(int p) { innerPriv = p; } | ||
+ | public final void setInnerPriv(int p) { innerPriv = p; } | ||
+ | public String toString() { | ||
+ | return " | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | 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** τότε ο μεταγλώττιστης εμφανίζει το παρακάτω μήνυμα λάθους. | ||
+ | |||
+ | <code java> | ||
+ | $> javac InnerClassInheritance.java | ||
+ | InnerClassInheritance.java: | ||
+ | super(p); | ||
+ | ^ | ||
+ | 1 error | ||
</ | </ | ||
+ | | Προηγούμενο : [[ : |
java/inner_class_inheritance.1486131915.txt.gz · Last modified: 2017/02/03 14:25 (external edit)