Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (static). Στατικές εμφωλευμένες κλάσεις είστε υποχρεωμένοι να ορίσετε στις παρακάτω περιπτώσεις:
Δείτε το παρακάτω παράδειγμα:
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; } } }
Από την μεταγλώττιση και εκτέλεση του παραπάνω κώδικα παρατηρούμε ότι αν και η κλάση StaticInnerClass δηλώνεται ως static μπορεί να δημιουργηθούν πολλαπλά αντικείμενα της κλάσης αυτής. Επίσης, τα αντικείμενα αυτά συνδέονται με το αντικείμενο της γονικής κλάσης και όχι με την γονική κλάση (όπως οι static μεταβλητές).
Σημαντική επιπλέον ιδιαιτερότητα των static εμφωλευμένων κλάσεων είναι ότι δεν έχουν απευθείας πρόσβαση στις μη-στατικές μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν, παρά μόνο στις στατικές μεταβλητές αυτής. H πρόσβαση στις μη-στατικές μεταβλητές αυτής μπορεί να γίνει μέσα από ένα αντικείμενο της εξωτερικής κλάσης.
Δείτε το παρακάτω παράδειγμα. Παρατηρήστε πως μπορείτε να έχετε πρόσβαση στις μη στατικές μεταβλητές της εξωτερικής κλάσης μέσω ενός αντικειμένου της κλάσης αυτής.
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; } } }
Πως όμως μπορείτε να δημιουργήσετε αντικείμενα μίας εμφωλευμένης στατικής κλάσης μέσα σε μία άλλη κλάση, διαφορετική της εξωτερικής κλάσης; Δείτε το παρακάτω παράδειγμα κώδικα και παρατηρήστε την διαφορά σε σχέση με την δημιουργία αντικειιμένων που ανήκουν σε μη στατικές κλάσεις.
public class TestNonStaticOuterClass { public static void main(String args[]) { NonStaticOuterClass.StaticInnerClass inner = new NonStaticOuterClass.StaticInnerClass(); inner.setInnerPub(6); System.out.println(inner); } }
Προηγούμενο: Εμφωλευμένες κλάσεις | Επόμενο: Μη στατικές εμφωλευμένες κλάσεις |