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
java:static_nested_classes [2015/04/30 11:49]
gthanos
java:static_nested_classes [2016/02/26 11:15] (current)
Line 1: Line 1:
 ====== Στατικές εμφωλευμένες κλάσεις ====== ====== Στατικές εμφωλευμένες κλάσεις ======
  
-Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές,​ ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (**static**) ​με τις εξής ιδιαιτερότητες:+Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές,​ ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (**static**). Στατικές εμφωλευμένες κλάσεις είστε υποχρεωμένοι να ορίσετε στις παρακάτω περιπτώσεις:
  
-  ​* Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//.+<WRAP important 80% center round> 
 +  ​* Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. Προσπαθήστε να ορίσετε ένα στατικό πεδία μέσα σε μία μη στατική εμφωλευμένη κλάση και δείτε το μήνυμα του compiler.
   * Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//.   * Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//.
 +</​WRAP>​
  
-Σημαντική ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι δεν έχουν απευθείας πρόσβαση στις μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν. ​Δείτε το παρακάτω παράδειγμα:​+Δείτε το παρακάτω παράδειγμα:​
  
 <code java NonStaticOuterClass.java>​ <code java NonStaticOuterClass.java>​
Line 19: Line 21:
     innerObj = new StaticInnerClass();​     innerObj = new StaticInnerClass();​
     innerObj.innerPriv = r.nextInt(10000);​     innerObj.innerPriv = r.nextInt(10000);​
 +    innerObj.innerPub = r.nextInt(10000);​
     innerObj1 = new StaticInnerClass(); ​   ​     innerObj1 = new StaticInnerClass(); ​   ​
     innerObj1.innerPriv = r.nextInt(10000);​     innerObj1.innerPriv = r.nextInt(10000);​
 +    innerObj1.innerPub = r.nextInt(10000);​
   }   }
   ​   ​
Line 35: Line 39:
     public void setInnerPub(int pub) { innerPub = pub; }     public void setInnerPub(int pub) { innerPub = pub; }
     public String toString() {      public String toString() { 
-      return "​innerPub:​ "​+innerPub; ​+      return "innerPriv: "​+innerPriv+", ​innerPub: "​+innerPub; ​
     }    ​     }    ​
   }  ​   }  ​
 } }
 </​code>​ </​code>​
 +
 +Από την μεταγλώττιση και εκτέλεση του παραπάνω κώδικα παρατηρούμε ότι αν και η κλάση //​StaticInnerClass//​ δηλώνεται ως //static// μπορεί να δημιουργηθούν πολλαπλά αντικείμενα της κλάσης αυτής. Επίσης,​ τα αντικείμενα αυτά __συνδέονται με το αντικείμενο της γονικής κλάσης και όχι με την γονική κλάση__ (όπως οι //static// μεταβλητές).
 +
 +===== Πρόσβαση στα στατικά και μη στατικά πεδία της εξωτερικής κλάσης =====
 +
 +Σημαντική επιπλέον ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι __δεν έχουν απευθείας πρόσβαση στις μη-στατικές μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν__,​ **παρά μόνο στις στατικές μεταβλητές αυτής**. H πρόσβαση στις μη-στατικές μεταβλητές αυτής μπορεί να γίνει μέσα από ένα αντικείμενο της εξωτερικής κλάσης.
 +
 +Δείτε το παρακάτω παράδειγμα. Παρατηρήστε πως μπορείτε να έχετε πρόσβαση στις μη στατικές μεταβλητές της εξωτερικής κλάσης μέσω ενός αντικειμένου της κλάσης αυτής.
 +
 +<code java NonStaticOuterClass.java>​
 +public class NonStaticOuterClass {
 +  static int s_int;
 +  int ns_int;
 +  ​
 +  public NonStaticOuterClass(int s, int ns) {
 +    s_int = s;
 +    ns_int = ns;
 +  }
 +  ​
 +  public String toString() {
 +     ​return "​static:​ "​+s_int+",​ non-static: "​+ns_int;​
 +  }  ​
 +  ​
 +  public static class StaticInnerClass {
 +
 +    void setOuterClass(NonStaticOuterClass outerObj, int o) {
 +      outerObj.s_int = o;
 +      outerObj.ns_int = 2*o;
 +    }
 +    ​
 +    void setOuterClassDirectly(int o) {
 +      s_int = o;
 +      //sn_int = 2*o;
 +    }
 +    ​
 +    public String toString() { 
 +      return "";​ //"​innerPriv:​ "​+innerPriv+",​ innerPub: "​+innerPub; ​
 +    }    ​
 +  }  ​
 +}
 +</​code>​
 +
 +===== Δημιουργία αντικειμένων της στατικής κλάσης από μία τρίτη κλάση διαφορετική της εξωτερικής κλάσης =====
 +
 +Πως όμως μπορείτε να δημιουργήσετε αντικείμενα μίας εμφωλευμένης στατικής κλάσης μέσα σε μία άλλη κλάση, διαφορετική της εξωτερικής κλάσης;​ Δείτε το παρακάτω παράδειγμα κώδικα και παρατηρήστε την διαφορά σε σχέση με την δημιουργία αντικειιμένων που ανήκουν σε μη στατικές κλάσεις.
  
 <code java TestNonStaticOuterClass.java>​ <code java TestNonStaticOuterClass.java>​
 public class TestNonStaticOuterClass { public class TestNonStaticOuterClass {
   public static void main(String args[]) {   public static void main(String args[]) {
-    NonStaticOuterClass ​outer = new NonStaticOuterClass(5); +    NonStaticOuterClass.StaticInnerClass inner = new NonStaticOuterClass.StaticInnerClass(); 
-    NonStaticOuterClass outer1 = new NonStaticOuterClass(10);​ +    ​inner.setInnerPub(6); 
-    System.out.println(outer); +    System.out.println(inner);
-    ​System.out.println("#########################"​); +
-    System.out.println(outer1);+
   }   }
 } }
 </​code>​ </​code>​
  
-Από την μεταγλώττιση και ​εκτέλεση του παραπάνω κώδικα παρατηρούμε ότι αν και η κλάση //​StaticInnerClass//​ δηλώνεται ως //​static// ​μπορεί να δημιουργηθούν πολλαπλά αντικείμενα μέσα σε κάθε γονική κλάση. Τα αντικείμενα αυτά συνδέονται με το αντικείμενο της γονικής κλάσης και όχι με την γονική κλάση (όπως οι //static// μεταβλητές).+|Προηγούμενο: [[ :​java:​nested_classes| Εμφωλευμένες κλάσεις ​ ]] | Επόμενο: [[ :​java:​inner_classes | Μη στατικές εμφωλευμένες κλάσεις ​]]| 
 + 
  
-< 
java/static_nested_classes.1430394572.txt.gz · Last modified: 2016/02/26 11:15 (external edit)