User Tools

Site Tools


java:inner_class_access

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Previous revision
java:inner_class_access [2021/04/12 04:48]
java:inner_class_access [2021/04/12 05:48]
gthanos [Πρόσβαση στα πεδία της εξωτερικής κλάσης (από την εσωτερική κλάση)]
Line 1: Line 1:
 +====== Προσβασιμότητα πεδίων και μεθόδων μεταξύ εσωτερικής και εξωτερικής κλάσης ======
  
 +===== Πρόσβαση στα πεδία της εξωτερικής κλάσης (από την εσωτερική κλάση) =====
 +
 +Κάθε εσωτερική κλάση έχει πρόσβαση στα πεδία και τις μεθόδους της εξωτερικής κλάσης, **ανεξάρτητα από τους προσδιοριστές πρόσβασης που έχουν αυτά**. Κάθε μέθοδος της εσωτερικής κλάσης μπορεί να έχει πρόσβαση σε μεταβλητές ή μεθόδους της εξωτερικής της κλάσης, ακόμη και εάν αυτές είναι δηλωμένες ως **private**. 
 +
 +<WRAP tip 80% round center>
 +Εάν μία μέθοδος της εσωτερικής κλάσης καλεί μία άλλη μέθοδο η οποία δεν ανήκει στην εσωτερική κλάση, τότε ο compiler αναζητά την μέθοδο στην εξωτερική κλάση. Αν δεν την βρει και στην εξωτερική κλάση τότε εμφανίζει μήνυμα λάθους. 
 +
 +Αντίστοιχα, εάν μία μέθοδος της εσωτερικής κλάσης χρησιμοποιήσει ένα πεδίο που δεν υπάρχει στην εσωτερική κλάση, ο compiler θα το αναζητήσει στην εξωτερική κλάση και μόνο αν δεν το βρει ούτε εκεί θα εκτυπώσει ένα μήνυμα λάθους.
 +</WRAP>
 +
 +Δείτε το παρακάτω παράδειγμα προσβασιμότητας των πεδίων της εξωτερικής κλάσης από την εσωτερική κλάση:
 +
 +<code java AccessOuterClassFromInnerClass.java>
 +public class AccessOuterClassFromInnerClass {
 +  private int outerPriv;
 +  int outerPckgPriv;
 +  protected int outerProt;
 +  public int outerPub;
 +  InnerClass ic;
 +  
 +  private void setOuterPriv(int v) { outerPriv = v; }
 +  private int getOuterPriv() { return outerPriv; }
 +  
 +  void setOuterPckgPriv(int v) { outerPckgPriv = v; }
 +  int getPckgOuterPriv() { return outerPckgPriv; }
 +  
 +  protected void setOuterProt(int v) { outerProt = v; }
 +  protected int getOuterProt() { return outerProt; }
 +  
 +  public void setOuterPub(int v) { outerPub = v; }
 +  public int getOuterPub() { return outerPub; }  
 +  
 +  public AccessOuterClassFromInnerClass() {
 +     ic = new InnerClass(1,2,3,4);
 +     ic.setOuterClassFields(5,6,7,8);
 +  }
 +  
 +  public String toString() {
 +    return "outerPriv: "+outerPriv+", outerPckgPriv: "+outerPckgPriv+
 +           ", outerProt: "+outerProt+", outerPub: "+outerPub;
 +  }
 +  
 +  private class InnerClass {
 +    //inner class has not fields
 +    
 +    public InnerClass(int p, int pp, int pr, int pu) {
 +      outerPriv = p;
 +      outerPckgPriv = pp;
 +      outerProt = pr;
 +      outerPub = pu;
 +    }
 +    
 +    public void setOuterClassFields(int p, int pp, int pr, int pu) {
 +      setOuterPriv(p);
 +      setOuterPckgPriv(pp);
 +      setOuterProt(pr);
 +      setOuterPub(pu);
 +    }    
 +  }
 +  
 +  public static void main(String args[]) {
 +    AccessOuterClassFromInnerClass oc = new AccessOuterClassFromInnerClass();
 +    System.out.println(oc);
 +  }
 +}
 +</code>
 +
 +<WRAP tip 80% center round>
 +Από το παραπάνω παράδειγμα, παρατηρούμε ότι η εσωτερική κλάση έχει πρόσβαση σε όλα τα πεδία και τις μεθόδους της εξωτερικής κλάσης, ανεξάρτητα από τον προσδιοριστή πρόσβασης που έχουν αυτά.
 +</WRAP>
 +
 +===== Πρόσβαση από την εξωτερική κλάση σε πεδία της εσωτερικής κλάσης =====
 +
 +Το παρακάτω παράδειγμα εξηγεί την προσβασιμότητα της εξωτερικής κλάσης σε πεδία και μεθόδους της εσωτερικής κλάσης.
 +
 +<code java AccessInnerClassFromOuterClass.java>
 +public class AccessInnerClassFromOuterClass {
 +  int outer;
 +  InnerOuterClass innerObj;
 +
 +  public AccessInnerClassFromOuterClass(int o) {
 +    outer = o;
 +    innerObj = new InnerOuterClass();
 +    innerObj.innerPriv = 10;
 +    innerObj.innerProt = 20;
 +    innerObj.innerPub = 30;
 +    System.out.println(innerObj);
 +  }
 +
 +  class InnerOuterClass {
 +    private int innerPriv;
 +    protected int innerProt;
 +    public int innerPub;
 +    
 +    private void setInnerPriv(int priv) { innerPriv = priv; }
 +    protected void setInnerProt(int prot) { innerProt = prot; }
 +    public void setInnerPub(int pub) { innerPub = pub; }
 +    public String toString() { 
 +      return "innerPriv: "+innerPriv+", innerProt: "+innerProt+
 +             ", innerPub: "+innerPub; 
 +    }    
 +  }
 +  
 +  public static void main(String[] args) {
 +    AccessInnerClassFromOuterClass outer = new AccessInnerClassFromOuterClass(5);
 +  }  
 +}
 +</code>
 +
 +Όπως θα παρατηρήσετε αν μεταγλωττίσετε και εκτελέσετε το πρόγραμμα η εξωτερική κλάση έχει απόλυτη πρόσβαση στα πεδία και τις μεθόδους της εσωτερικής κλάσης ανεξάρτητα από τον προσδιοριστή πρόσβασης που έχουν αυτά. Η πρόσβαση της εξωτερικής κλάσης στα πεδία της εσωτερικής γίνεται πάντα μέσω ενός αντικειμένου της εξωτερικής κλάσης.
 +
 +<WRAP tip 80% center round>
 +  * H εσωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εξωτερικής κλάσης.
 +  * Η εξωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εσωτερικής κλάσης. Η πρόσβαση στα πεδία αυτά γίνεται μέσω ενός αντικειμένου της εξωτερικής κλάσης.
 +
 +Οι προσδιοριστές πρόσβασης **δεν εισάγουν κανένα περιορισμό** στον προσδιορισμό της προσβασιμότητας των πεδίων και των μεθόδων της εσωτερικής κλάσης από την εξωτερική κλάση και αντίστροφα.
 +</WRAP>
 +
 +| Προηγούμενο : [[ :java:inner_class_objects | Δημιουργία αντικειμένων της εσωτερικής κλάση ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:inner_class_inheritance | Κληρονομικότητα εσωτερικών κλάσεων ]]  |
java/inner_class_access.txt · Last modified: 2021/04/12 04:48 (external edit)