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