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 revisionPrevious revision
Next revision
Previous revision
java:inner_class_access [2017/02/03 13:59] gthanosjava:inner_class_access [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
 ====== Προσβασιμότητα πεδίων και μεθόδων μεταξύ εσωτερικής και εξωτερικής κλάσης ====== ====== Προσβασιμότητα πεδίων και μεθόδων μεταξύ εσωτερικής και εξωτερικής κλάσης ======
- 
  
 ===== Πρόσβαση στα πεδία της εξωτερικής κλάσης (από την εσωτερική κλάση) ===== ===== Πρόσβαση στα πεδία της εξωτερικής κλάσης (από την εσωτερική κλάση) =====
Line 14: Line 13:
 Δείτε το παρακάτω παράδειγμα προσβασιμότητας των πεδίων της εξωτερικής κλάσης από την εσωτερική κλάση: Δείτε το παρακάτω παράδειγμα προσβασιμότητας των πεδίων της εξωτερικής κλάσης από την εσωτερική κλάση:
  
-<code java OuterClassAccess.java> +<code java AccessOuterClassFromInnerClass.java> 
-public class OuterClassAccess {+public class AccessOuterClassFromInnerClass {
   private int outerPriv;   private int outerPriv;
   int outerPckgPriv;   int outerPckgPriv;
Line 34: Line 33:
   public int getOuterPub() { return outerPub; }     public int getOuterPub() { return outerPub; }  
      
-  public OuterClassAccess() {+  public AccessOuterClassFromInnerClass() {
      ic = new InnerClass(1,2,3,4);      ic = new InnerClass(1,2,3,4);
      ic.setOuterClassFields(5,6,7,8);      ic.setOuterClassFields(5,6,7,8);
Line 45: Line 44:
      
   private class InnerClass {   private class InnerClass {
-  +    //inner class has not fields 
 +    
     public InnerClass(int p, int pp, int pr, int pu) {     public InnerClass(int p, int pp, int pr, int pu) {
       outerPriv = p;       outerPriv = p;
Line 62: Line 62:
      
   public static void main(String args[]) {   public static void main(String args[]) {
-    OuterClassAccess oc = new OuterClassAccess();+    AccessOuterClassFromInnerClass oc = new AccessOuterClassFromInnerClass();
     System.out.println(oc);     System.out.println(oc);
   }   }
Line 68: Line 68:
 </code> </code>
  
-<WRAP important 80% center round>+<WRAP tip 80% center round>
 Από το παραπάνω παράδειγμα, παρατηρούμε ότι η εσωτερική κλάση έχει πρόσβαση σε όλα τα πεδία και τις μεθόδους της εξωτερικής κλάσης, ανεξάρτητα από τον προσδιοριστή πρόσβασης που έχουν αυτά. Από το παραπάνω παράδειγμα, παρατηρούμε ότι η εσωτερική κλάση έχει πρόσβαση σε όλα τα πεδία και τις μεθόδους της εξωτερικής κλάσης, ανεξάρτητα από τον προσδιοριστή πρόσβασης που έχουν αυτά.
 </WRAP> </WRAP>
Line 76: Line 76:
 Το παρακάτω παράδειγμα εξηγεί την προσβασιμότητα της εξωτερικής κλάσης σε πεδία και μεθόδους της εσωτερικής κλάσης. Το παρακάτω παράδειγμα εξηγεί την προσβασιμότητα της εξωτερικής κλάσης σε πεδία και μεθόδους της εσωτερικής κλάσης.
  
-<code java OuterClass.java> +<code java AccessInnerClassFromOuterClass.java> 
-public class OuterClass {+public class AccessInnerClassFromOuterClass {
   int outer;   int outer;
   InnerOuterClass innerObj;   InnerOuterClass innerObj;
  
-  public OuterClass(int o) {+  public AccessInnerClassFromOuterClass(int o) {
     outer = o;     outer = o;
     innerObj = new InnerOuterClass();     innerObj = new InnerOuterClass();
Line 105: Line 105:
      
   public static void main(String[] args) {   public static void main(String[] args) {
-    OuterClass outer = new OuterClass(5);+    AccessInnerClassFromOuterClass outer = new AccessInnerClassFromOuterClass(5);
   }     }  
 } }
Line 112: Line 112:
 Όπως θα παρατηρήσετε αν μεταγλωττίσετε και εκτελέσετε το πρόγραμμα η εξωτερική κλάση έχει απόλυτη πρόσβαση στα πεδία και τις μεθόδους της εσωτερικής κλάσης ανεξάρτητα από τον προσδιοριστή πρόσβασης που έχουν αυτά. Η πρόσβαση της εξωτερικής κλάσης στα πεδία της εσωτερικής γίνεται πάντα μέσω ενός αντικειμένου της εξωτερικής κλάσης. Όπως θα παρατηρήσετε αν μεταγλωττίσετε και εκτελέσετε το πρόγραμμα η εξωτερική κλάση έχει απόλυτη πρόσβαση στα πεδία και τις μεθόδους της εσωτερικής κλάσης ανεξάρτητα από τον προσδιοριστή πρόσβασης που έχουν αυτά. Η πρόσβαση της εξωτερικής κλάσης στα πεδία της εσωτερικής γίνεται πάντα μέσω ενός αντικειμένου της εξωτερικής κλάσης.
  
-<WRAP important 80% center round>+<WRAP tip 80% center round>
   * H εσωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εξωτερικής κλάσης.   * H εσωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εξωτερικής κλάσης.
   * Η εξωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εσωτερικής κλάσης. Η πρόσβαση στα πεδία αυτά γίνεται μέσω ενός αντικειμένου της εξωτερικής κλάσης.   * Η εξωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εσωτερικής κλάσης. Η πρόσβαση στα πεδία αυτά γίνεται μέσω ενός αντικειμένου της εξωτερικής κλάσης.
Line 119: Line 119:
 </WRAP> </WRAP>
  
-===== Χρήση προσδιοριστών πρόσβασης στην εσωτερική κλάση ===== +| Προηγούμενο [[ :java:inner_class_objects Δημιουργία αντικειμένων της εσωτερικής κλάση ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:inner_class_inheritance | Κληρονομικότητα εσωτερικών κλάσεων ]]  |
- +
-Είδαμε ότι οι εξωτερικές κλάσεις μπορούν να έχουν τους προσδιοριστές πρόσβασης //public// και //package private// (κανένας προσδιοριστής). Για τις εσωτερικές κλάσεις ο κανόνας  +
- +
-Στο προηγούμενο παράδειγμα δοκιμάστε να αλλάξετε τον προσδιοριστή πρόσβασης της κλάσης **InnerClass** από package private σε private. Σε αυτή την περίπτωση θα παρατηρήσετε ότι η κλάση **TestOuterClass** δεν μεταγλωττίζεται. Συγκεκριμένα, o compiler εμφανίζει το παρακάτω μήνυμα λάθους, σημειώνοντας ότι ο προσδιοριστής πρόσβασης **private** δεν επιτρέπει τη πρόσβαση από μία άλλη κλάση στο συγκεκριμένο περιεχόμενο της **OuterClass**. Γενικότερα, ισχύουν οι κανόνες για τους προσδιοριστές πρόσβασης όπως αυτοί αναφέρονται [[java:access_modifiers|εδώ]]. +
- +
-<code> +
-TestOuterClass.java:6: error: OuterClass.InnerOuterClass has private access in OuterClass +
-    OuterClass.InnerOuterClass inner = outer.new InnerOuterClass(4); +
-              ^ +
-TestOuterClass.java:6: error: OuterClass.InnerOuterClass has private access in OuterClass +
-    OuterClass.InnerOuterClass inner = outer.new InnerOuterClass(4); +
-</code> +
- +
-<WRAP tip 80% center round> +
-Το παραπάνω εξηγεί ικανοποιητικά τον τρόπο με τον οποίο μπορείτε να αποκλείσετε την πρόσβαση στην εσωτερική κλάση από άλλες κλάσεις πέραν της εξωτερικής. Ορίζοντας την εσωτερική κλάση ως **private** αυτή είναι προσβάσιμη μόνο από την εξωτερική της κλάση+
-</WRAP> +
- +
- +
-===== Πρόσβαση από άλλες κλάσεις σε πεδία της εσωτερικής κλάσης ===== +
- +
-Ο παρακάτω κώδικας επιχειρεί να δημιουργήσει ένα αντικείμενο μίας εσωτερικής κλάσης από μία άλλη κλάση. Σε αυτή την περίπτωση και __με την προϋπόθεση ότι η εσωτερική κλάση είναι συνολικά προσβάσιμη__ από την κλάση που επιχειρεί να δημιουργήσει το αντικείμενο, η προσβασιμότητα των πεδίων και των μεθόδων της εσωτερικής κλάσης εξαρτάται από τους προσδιοριστές πρόσβασης που έχουν αυτά. Δείτε το παρακάτω παράδειγμα. +
- +
-<code java OuterClass.java> +
-public class OuterClass { +
-  int outer; +
-  InnerClass innerObj; +
- +
-  public OuterClass(int o) { +
-    outer = o; +
-    innerObj = new InnerClass(); +
-    innerObj.innerPriv = 10; +
-    innerObj.innerProt = 20; +
-    innerObj.innerPub = 30; +
-    System.out.println(innerObj); +
-  } +
- +
-  class InnerClass { +
-    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;  +
-    }     +
-  } +
-   +
-+
-</code> +
- +
-<code java TestOuterClass.java> +
-public class TestOuterClass { +
-  public static void main(String args[]) { +
-    OuterClass outer = new OuterClass(5); +
-    OuterClass.InnerClass inner = outer.new InnerClass(); +
-    inner.setInnerPriv(4); +
-    inner.setInnerProt(5); +
-    inner.setInnerPub(6); +
-    System.out.println(inner);     +
-  } +
-+
-</code> +
- +
-Κατά συνέπεια, για την προσβασιμότητα των πεδίων και των μεθόδων της εσωτερικής κλάσης από μία άλλη κλάση ισχύουν τα εξής: +
-  - Η εσωτερική κλάση θα πρέπει να είναι συνολικά προσβάσιμη. +
-  - Με την προϋπόθεση ότι ισχύει το **1.**, ισχύουν οι [[java:access_modifiers|κανόνες προσβασιμότητας]] που ορίζονται από προσδιοριστές πρόσβασης. +
- +
java/inner_class_access.1486130386.txt.gz · Last modified: 2017/02/03 13:59 by gthanos