java:static_nested_classes

Differences

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

Link to this comparison view

Next revision
Previous revision
java:static_nested_classes [2015/04/29 03:48]
gthanos created
java:static_nested_classes [2016/02/26 11:15] (current)
Line 1: Line 1:
 ====== Στατικές εμφωλευμένες κλάσεις ====== ====== Στατικές εμφωλευμένες κλάσεις ======
  
-Οι στατικές εμφωλευμένες κλάσεις ​συνδέονται με την εξωτερική κλάσης. Όπως οι στατικές μέθοδοι δεν έχουν πρόσβαση σε μη στατικά ​πεδία και μεθόδους της κλάσης έτσι και οι στατικές εμφωλευμένες κλάσεις έχουν πρόσβαση μόνο στα στατικά πεδία και μεθόδους της εξωτερικής κλάσης ​ηλαδή μόνο με τα πεδία και τις μεθόδους που συνδέονται με την εξωτερική κλάση).+Μέχρι τώρα ορίσαμε ​στατικές ​μεθόδους και στατικές μεταβλητές,​ ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις ​μπορούν να οριστούν και ως στατικές (**static**). Στατικές εμφωλευμένες κλάσεις είστε υποχρεωμένοι να ορίσετε στις παρακάτω περιπτώσεις:​ 
 + 
 +<WRAP important 80% center round> 
 +  * Οι μη στατικές εμφωλευμένες ​κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ​ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. Προσπαθήστε να ορίσετε ένα στατικό πεδία μέσα σε μία ​μη στατική εμφωλευμένη κλάση και δείτε το μήνυμα του compiler. 
 +  * Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε ​μεθόδους της εμφωλευμένης κλάσης ​μέσα ​από μία ​στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //​static//​. 
 +</​WRAP>​ 
 + 
 +Δείτε το παρακάτω παράδειγμα:​ 
 + 
 +<code java NonStaticOuterClass.java>​ 
 +public class NonStaticOuterClass { 
 +  static int outer; 
 +  StaticInnerClass innerObj; 
 +  StaticInnerClass innerObj1;​ 
 + 
 +  public NonStaticOuterClass(int o) { 
 +    outer = o; 
 +    java.util.Random r = new java.util.Random();​ 
 +    innerObj = new StaticInnerClass();​ 
 +    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() { 
 +     ​return "​outer:​ "​+outer+"​ | "​+innerObj.toString() +" - "+ innerObj1.toString();​ 
 +  }   
 +   
 +  public static class StaticInnerClass { 
 +    private int innerPriv;​ 
 +    protected int innerProt;​ 
 +    public int innerPub; 
 +     
 +    private void setInnerPriv(int priv) { innerPriv = priv; } 
 +    public void setInnerPub(int pub) { innerPub = pub; } 
 +    public String toString() {  
 +      return "​innerPriv:​ "​+innerPriv+",​ innerPub: "​+innerPub;​  
 +    }     
 +  }   
 +
 +</​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>​ 
 +public class TestNonStaticOuterClass { 
 +  public static void main(String args[]
 +    NonStaticOuterClass.StaticInnerClass inner = new NonStaticOuterClass.StaticInnerClass();​ 
 +    inner.setInnerPub(6);​ 
 +    System.out.println(inner);​ 
 +  } 
 +
 +</​code>​ 
 + 
 +|Προηγούμενο:​ [[ :​java:​nested_classes| Εμφωλευμένες κλάσεις ​ ]] | Επόμενο:​ [[ :​java:​inner_classes | Μη στατικές εμφωλευμένες κλάσεις ]]| 
 + 
 + 
java/static_nested_classes.1430279328.txt.gz · Last modified: 2016/02/26 11:15 (external edit)