User Tools

Site Tools


java:inner_class_inheritance

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
java:inner_class_inheritance [2017/02/03 14:25] – created gthanosjava:inner_class_inheritance [2020/03/23 09:06] (current) – [Κληρονομικότητα εσωτερικών κλάσεων από εσωτερικές κλάσεις άλλων εξωτερικών κλάσεων] gthanos
Line 1: Line 1:
- 
 ====== Κληρονομικότητα εσωτερικών κλάσεων ====== ====== Κληρονομικότητα εσωτερικών κλάσεων ======
 +
 +<WRAP important 70% center round>
 +===Η συγκεκριμένη ενότητα είναι προαιρετική και μπορείτε να την παραλήψετε κατά την ανάγνωση της θεωρείας του μαθήματος.===
 +</WRAP>
  
 Η εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις που ανήκουν στην ίδια εξωτερική κλάση ή εξωτερικές κλάσεις. Δείτε το παρακάτω παράδειγμα κληρονομικότητας εσωτερικών κλάσεων. Η εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις που ανήκουν στην ίδια εξωτερική κλάση ή εξωτερικές κλάσεις. Δείτε το παρακάτω παράδειγμα κληρονομικότητας εσωτερικών κλάσεων.
  
 <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: "+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);
 +  } 
 +}
 +</code>
 +
 +Παρατηρήστε ότι το πρόγραμμα μεταγλωττίζεται κανονικά και εκτυπώνει το παρακάτω:
 +<code>
 +$> java InnerClassInheritance 
 +outer (int): 2, innerObj: innerPriv: 4
 +innerPriv: 10
 +innerPriv: 20
 +</code>
 +
 +Είδαμε ότι οι εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις που ανήκουν στην ίδια εξωτερική 
 +κλάση ή εξωτερικές κλάσεις. 
 +
 +===== Κληρονομικότητα εσωτερικών κλάσεων από εσωτερικές κλάσεις άλλων εξωτερικών κλάσεων =====
 +
 +Οι εσωτερικές κλάσεις μπορούν να κληρονομούν εσωτερικές κλάσεις άλλων εξωτερικών κλάσεων μόνο εάν η ιδιότητα της κληρονομικότητας ισχύει τόσο σε επίπεδο εσωτερικών όσο και σε επίπεδο εξωτερικών κλάσεων. Δείτε το παρακάτω παράδειγμα που αποτελεί επέκταση του προηγούμενου.
 +
 +<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: "+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);
 +    }
 +  }
 +}
 +</code>
 +
 +Εάν στο παραπάνω παράδειγμα αφαιρέσετε την κληρονομικότητα μεταξύ των κλάσεων **AnotherOuterClass --> OuterClass** τότε ο μεταγλώττιστης εμφανίζει το παρακάτω μήνυμα λάθους.
 +
 +<code java>
 +$> javac InnerClassInheritance.java 
 +InnerClassInheritance.java:50: error: an enclosing instance that contains OuterClass.InnerClass is required
 +      super(p);
 +      ^
 +1 error
 </code> </code>
  
 +| Προηγούμενο : [[ :java:inner_class_access | Προσβασιμότητα πεδίων και μεθόδων μεταξύ εσωτερικής και εξωτερικής κλάσης ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:local_inner_classes | Τοπικές εμφωλευμένες κλάσεις  ]]  |
java/inner_class_inheritance.1486131915.txt.gz · Last modified: 2017/02/03 14:25 (external edit)