User Tools

Site Tools


java:static_nested_classes

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:static_nested_classes [2015/05/04 06:59] – [Πρόσβαση στα στατικά και μη στατικά πεδία της εξωτερικής κλάσης] gthanosjava:static_nested_classes [2020/03/16 09:55] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Στατικές εμφωλευμένες κλάσεις ====== ====== Στατικές εμφωλευμένες κλάσεις ======
 +
 +<WRAP important 70% center round>
 +===Η συγκεκριμένη ενότητα είναι προαιρετική και μπορείτε να την παραλήψετε κατά την ανάγνωση της θεωρείας του μαθήματος.===
 +</WRAP>
  
 Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (**static**). Στατικές εμφωλευμένες κλάσεις είστε υποχρεωμένοι να ορίσετε στις παρακάτω περιπτώσεις: Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (**static**). Στατικές εμφωλευμένες κλάσεις είστε υποχρεωμένοι να ορίσετε στις παρακάτω περιπτώσεις:
  
-<WRAP important 80% center round> +  - Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. Προσπαθήστε να ορίσετε ένα στατικό πεδία μέσα σε μία μη στατική εμφωλευμένη κλάση και δείτε το μήνυμα του compiler. 
-  * Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. Προσπαθήστε να ορίσετε ένα στατικό πεδία μέσα σε μία μη στατική εμφωλευμένη κλάση και δείτε το μήνυμα του compiler. +  Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//.
-  Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//. +
-</WRAP>+
  
-Δείτε το παρακάτω παράδειγμα:+Δείτε το παρακάτω παράδειγμα, όπου η εσωτερική στατική κλάση έχει πρόσβαση στο στατικό πεδίο της εξωτερικής κλάσης.
  
 <code java NonStaticOuterClass.java> <code java NonStaticOuterClass.java>
Line 14: Line 16:
   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 36: Line 32:
     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> 
 +Από την μεταγλώττιση και εκτέλεση του παραπάνω κώδικα παρατηρούμε ότι  
 +  * αν και η κλάση //StaticInnerClass// δηλώνεται ως //static// μπορεί να δημιουργηθούν πολλαπλά αντικείμενα της κλάσης αυτής.  
 +  * Τα αντικείμενα της στατικής εσωτερικής κλάσης ΔΕΝ ανήκουν στην εξωτερική κλάση, όπως συμβαίνει στις μη στατικές κλάσεις. Στο παραπάνω παράδειγμα, η σύνδεση μεταξύ εσωτερικής στατικής και εξωτερικής μη στατικής κλάσης έγκειται στο γεγονός ότι ένα πεδίο της εξωτερικής κλάσης είναι του τύπου της εσωτερικής κλάσης. 
 +  * Η τελευταία γραμμή της μεθόδου **main** δείχνει ότι οι στατικές εσωτερικές κλάσεις μπορούν να οριστούν ανεξάρτητα από αντικείμενα της εξωτερικής τους κλάσης. Επιβεβαιώστε την αλήθεια του ισχυρισμού μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα. 
 +</WRAP> 
  
 ===== Πρόσβαση στα στατικά και μη στατικά πεδία της εξωτερικής κλάσης ===== ===== Πρόσβαση στα στατικά και μη στατικά πεδία της εξωτερικής κλάσης =====
  
-Σημαντική επιπλέον ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι __δεν έχουν απευθείας πρόσβαση στις μη-στατικές μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν__, **παρά μόνο στις στατικές μεταβλητές αυτής**. H πρόσβαση στις μη-στατικές μεταβλητές αυτής μπορεί να γίνει μέσα από ένα αντικείμενο της εξωτερικής κλάσης.+Σημαντική ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι __δεν έχουν απευθείας πρόσβαση στις μη-στατικές μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν__, **αλλά μόνο στις στατικές μεταβλητές αυτής**. H πρόσβαση στις μη-στατικές μεταβλητές μπορεί να γίνει μέσα από ένα αντικείμενο της εξωτερικής κλάσης.
  
-Δείτε το παρακάτω παράδειγμα. Παρατηρήστε πως μπορείτε να έχετε πρόσβαση στις μη στατικές μεταβλητές της εξωτερικής κλάσης μέσω ενός αντικειμένου της κλάσης αυτής.+Το παρακάτω παράδειγμα δείχνει ότι πως μπορείτε να έχετε πρόσβαση στις μη στατικές μεταβλητές της εξωτερικής κλάσης μέσω ενός αντικειμένου της κλάσης αυτής.
  
 <code java NonStaticOuterClass.java> <code java NonStaticOuterClass.java>
Line 76: Line 92:
     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 86: Line 102:
 </code> </code>
  
-===== Δημιουργία αντικειμένων της στατικής κλάσης από μία τρίτη κλάση διαφορετική της εξωτερικής κλάσης =====+===== Δημιουργία αντικειμένων της εμφωλευμένης στατικής κλάσης από μία τρίτη κλάση διαφορετική της εξωτερικής κλάσης =====
  
-Πως όμως μπορείτε να δημιουργήσετε αντικείμενα μίας εμφωλευμένης στατικής κλάσης μέσα σε μία άλλη κλάση, διαφορετική της εξωτερικής κλάσης; Δείτε το παρακάτω παράδειγμα κώδικα και παρατηρήστε την διαφορά σε σχέση με την δημιουργία αντικειιμένων που ανήκουν σε μη στατικές κλάσεις.+Πως όμως μπορείτε να δημιουργήσετε αντικείμενα μίας εμφωλευμένης στατικής κλάσης μέσα σε μία άλλη κλάση, διαφορετική της εξωτερικής κλάσης; Δείτε το παρακάτω παράδειγμα κώδικα και παρατηρήστε την διαφορά σε σχέση με την δημιουργία αντικειμένων που ανήκουν σε μη στατικές κλάσεις.
  
 <code java TestNonStaticOuterClass.java> <code java TestNonStaticOuterClass.java>
Line 94: Line 110:
   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.1430722791.txt.gz · Last modified: 2015/05/04 05:59 (external edit)