java:static_nested_classes

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Στατικές εμφωλευμένες κλάσεις ====== Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (**static**). Στατικές εμφωλευμένες κλάσεις είστε υποχρεωμένοι να ορίσετε στις παρακάτω περιπτώσεις: <WRAP important 80% center round> * Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. Προσπαθήστε να ορίσετε ένα στατικό πεδία μέσα σε μία μη στατική εμφωλευμένη κλάση και δείτε το μήνυμα του compiler. * Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//. * Σημαντική ιδιαιτερότητα των //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// μεταβλητές). <WRAP important 80% center round> Σημαντική επιπλέον ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι __δεν έχουν απευθείας πρόσβαση στις μη-στατικές μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν__, **παρά μόνο στις στατικές μεταβλητές αυτής**. H πρόσβαση στις μη-στατικές μεταβλήτές αυτή μπορεί να γίνει μέσα από ένα αντικείμενο της εξωτερικής κλάσης, όπως φαίνεται παρακάτω. </WRAP> Δείτε το παρακάτω παράδειγμα. Παρατηρήστε πως μπορείτε να έχετε πρόσβαση στις μη στατικές μεταβλητές της εξωτερικής κλάσης μέσω του πιο πάνω επιπέδου. <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.1430396669.txt.gz · Last modified: 2016/02/26 11:15 (external edit)