java:static_nested_classes

Differences

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

Link to this comparison view

java:static_nested_classes [2015/04/30 13:21]
gthanos [Στατικές εμφωλευμένες κλάσεις]
java:static_nested_classes [2020/03/16 09:55]
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/static_nested_classes.txt · Last modified: 2020/03/16 09:55 (external edit)