java:static_nested_classes

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
java:static_nested_classes [2015/04/30 12:24]
gthanos
java:static_nested_classes [2018/03/21 10:13]
gthanos [Στατικές εμφωλευμένες κλάσεις]
Line 3: Line 3:
 Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (**static**). Στατικές εμφωλευμένες κλάσεις είστε υποχρεωμένοι να ορίσετε στις παρακάτω περιπτώσεις: Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (**static**). Στατικές εμφωλευμένες κλάσεις είστε υποχρεωμένοι να ορίσετε στις παρακάτω περιπτώσεις:
  
-<WRAP important 80% center round> +  - Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. Προσπαθήστε να ορίσετε ένα στατικό πεδία μέσα σε μία μη στατική εμφωλευμένη κλάση και δείτε το μήνυμα του compiler. 
-  * Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. Προσπαθήστε να ορίσετε ένα στατικό πεδία μέσα σε μία μη στατική εμφωλευμένη κλάση και δείτε το μήνυμα του compiler. +  Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//.
-  Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//. +
-  * Σημαντική ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι δεν έχουν απευθείας πρόσβαση στις μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν. +
-</WRAP>+
  
- Δείτε το παρακάτω παράδειγμα:+Δείτε το παρακάτω παράδειγμα, όπου η εσωτερική στατική κλάση έχει πρόσβαση στο στατικό πεδίο της εξωτερικής κλάσης.
  
 <code java NonStaticOuterClass.java> <code java NonStaticOuterClass.java>
Line 15: Line 12:
   static int outer;   static int outer;
   StaticInnerClass innerObj;   StaticInnerClass innerObj;
-  StaticInnerClass innerObj1; 
  
   public NonStaticOuterClass(int o) {   public NonStaticOuterClass(int o) {
     outer = o;     outer = o;
     java.util.Random r = new java.util.Random();     java.util.Random r = new java.util.Random();
-    innerObj = new StaticInnerClass(); +    innerObj = new StaticInnerClass(r.nextInt(100)r.nextInt(100)r.nextInt(100));
-    innerObj.innerPriv = r.nextInt(10000)+
-    innerObj.innerPub = r.nextInt(10000)+
-    innerObj1 = new StaticInnerClass();     +
-    innerObj1.innerPriv = r.nextInt(10000)+
-    innerObj1.innerPub = r.nextInt(10000);+
   }   }
      
   public String toString() {   public String toString() {
-     return "outer: "+outer+" | "+innerObj.toString() +" - "+ innerObj1.toString();+     return "outer: "+outer+" | "+innerObj.toString();
   }     }  
      
Line 37: Line 28:
     public int innerPub;     public int innerPub;
          
-    private void setInnerPriv(int priv) { innerPriv = priv} +    public StaticInnerClass(int innerPriv, int innerProt,int innerPub) { 
-    public void setInnerPub(int pub) { innerPub = pub; }+      this.innerPriv = innerPriv
 +      this.innerProt = innerProt; 
 +      this.innerPub = innerPub; 
 +        
 +    
     public String toString() {      public String toString() { 
-      return "innerPriv: "+innerPriv+", innerPub: "+innerPub; +      return "innerPriv: "+innerPriv+", innerPub: "+innerPub +", innerProt: "+innerProt
     }         }    
 +  }
 +  
 +  public static void main(String args[]) {
 +    NonStaticOuterClass myOuter = new NonStaticOuterClass(10);
 +    System.out.println(myOuter.innerObj.toString());
 +    StaticInnerClass myInnerObj = new StaticInnerClass(15, 20, 35);
 +    System.out.println(myInnerObj);
 +    
 +    NonStaticOuterClass.StaticInnerClass myInnerObj2 = new NonStaticOuterClass.StaticInnerClass(100, 200, 300);
 +    System.out.println(myInnerObj2);
   }     }  
 } }
 </code> </code>
  
-Από την μεταγλώττιση και εκτέλεση του παραπάνω κώδικα παρατηρούμε ότι αν και η κλάση //StaticInnerClass// δηλώνεται ως //static// μπορεί να δημιουργηθούν πολλαπλά αντικείμενα μέσα σε κάθε γονική κλάση. Τα αντικείμενα αυτά __συνδέονται με το αντικείμενο της γονικής κλάσης και όχι με την γονική κλάση__ (όπως οι //static// μεταβλητές). +<WRAP tip 80% center round> 
- +Από την μεταγλώττιση και εκτέλεση του παραπάνω κώδικα παρατηρούμε ότι  
-<WRAP important 80% center round> +  * αν και η κλάση //StaticInnerClass// δηλώνεται ως //static// μπορεί να δημιουργηθούν πολλαπλά αντικείμενα της κλάσης αυτής 
-Σημαντική επιπλέον ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι __δεν έχουν απευθείας πρόσβαση στις μη-στατικές μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν__, **παρά μόνο στις στατικές μεταβλητές αυτής**. H πρόσβαση στις μη-στατικές μεταβλήτές αυτή μπορεί να γίνει μέσα από ένα αντικείμενο της εξωτερικής κλάσης, όπως φαίνεται παρακάτω.+  * Τα αντικείμενα της στατικής εσωτερικής κλάσης ΔΕΝ ανήκουν στην εξωτερική κλάσηόπως συμβαίνει στις μη στατικές κλάσεις. Στο παραπάνω παράδειγμα, η σύνδεση μεταξύ εσωτερικής στατικής και εξωτερικής μη στατικής κλάσης έγκειται στο γεγονός ότι ένα πεδίο της εξωτερικής κλάσης είναι του τύπου της εσωτερικής κλάσης
 +  * Η τελευταία γραμμή της μεθόδου **main** δείχνει ότι οι στατικές εσωτερικές κλάσεις μπορούν να οριστούν ανεξάρτητα από αντικείμενα της εξωτερικής τους κλάσης. Επιβεβαιώστε την αλήθεια του ισχυρισμού μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα.
 </WRAP> </WRAP>
  
-Δείτε το παρακάτω παράδειγμα. Παρατηρήστε πως μπορείτε να έχετε πρόσβαση στις μη στατικές μεταβλητές της εξωτερικής κλάσης μέσω του πιο πάνω επιπέδου.+ 
 +===== Πρόσβαση στα στατικά και μη στατικά πεδία της εξωτερικής κλάσης ===== 
 + 
 +Σημαντική ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι __δεν έχουν απευθείας πρόσβαση στις μη-στατικές μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν__, **αλλά μόνο στις στατικές μεταβλητές αυτής**H πρόσβαση στις μη-στατικές μεταβλητές μπορεί να γίνει μέσα από ένα αντικείμενο της εξωτερικής κλάσης. 
 + 
 +Το παρακάτω παράδειγμα δείχνει ότι πως μπορείτε να έχετε πρόσβαση στις μη στατικές μεταβλητές της εξωτερικής κλάσης μέσω ενός αντικειμένου της κλάσης αυτής.
  
 <code java NonStaticOuterClass.java> <code java NonStaticOuterClass.java>
Line 77: Line 88:
     void setOuterClassDirectly(int o) {     void setOuterClassDirectly(int o) {
       s_int = o;       s_int = o;
-      //sn_int = 2*o;+      //sn_int = 2*o;      // comment out this line and compile again
     }     }
          
     public String toString() {      public String toString() { 
-      return ""; //"innerPriv: "+innerPriv+", innerPub: "+innerPub+      return "s_int: "+s_int
     }         }    
   }     }  
Line 87: Line 98:
 </code> </code>
  
-Πως όμως μπορείτε να δημιουργήσετε αντικείμενα μίας εμφωλευμένης στατικής κλάσης μέσα σε μία άλλη κλάση, διαφορετική της εξωτερικής της κλάσης; Δείτε το παρακάτω παράδειγμα κώδικα και παρατηρήστε την διαφορά σε σχέση με τις μη στατικές κλάσεις.+===== Δημιουργία αντικειμένων της εμφωλευμένης στατικής κλάσης από μία τρίτη κλάση διαφορετική της εξωτερικής κλάσης ===== 
 + 
 +Πως όμως μπορείτε να δημιουργήσετε αντικείμενα μίας εμφωλευμένης στατικής κλάσης μέσα σε μία άλλη κλάση, διαφορετική της εξωτερικής κλάσης; Δείτε το παρακάτω παράδειγμα κώδικα και παρατηρήστε την διαφορά σε σχέση με την δημιουργία αντικειμένων που ανήκουν σε μη στατικές κλάσεις.
  
 <code java TestNonStaticOuterClass.java> <code java TestNonStaticOuterClass.java>
Line 93: Line 106:
   public static void main(String args[]) {   public static void main(String args[]) {
     NonStaticOuterClass.StaticInnerClass inner = new NonStaticOuterClass.StaticInnerClass();     NonStaticOuterClass.StaticInnerClass inner = new NonStaticOuterClass.StaticInnerClass();
-    inner.setInnerPub(6);+    inner.setOuterClassDirectly(6);
     System.out.println(inner);     System.out.println(inner);
   }   }
 } }
 </code> </code>
 +
 +|Προηγούμενο: [[ :java:nested_classes| Εμφωλευμένες κλάσεις  ]] | Επόμενο: [[ :java:exceptions_intro | Εξαιρέσεις ]]|
 +
  
  
java/static_nested_classes.txt · Last modified: 2020/03/16 09:55 (external edit)