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)
