This shows you the differences between two versions of the page.
java:static_nested_classes [2015/04/30 11:49] gthanos |
java:static_nested_classes [2016/02/26 11:15] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Στατικές εμφωλευμένες κλάσεις ====== | ||
- | Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (**static**) με τις εξής ιδιαιτερότητες: | ||
- | |||
- | * Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. | ||
- | * Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//. | ||
- | |||
- | Σημαντική ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι δεν έχουν απευθείας πρόσβαση στις μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν. Δείτε το παρακάτω παράδειγμα: | ||
- | |||
- | <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); | ||
- | innerObj1 = new StaticInnerClass(); | ||
- | innerObj1.innerPriv = 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 "innerPub: "+innerPub; | ||
- | } | ||
- | } | ||
- | } | ||
- | </code> | ||
- | |||
- | <code java TestNonStaticOuterClass.java> | ||
- | public class TestNonStaticOuterClass { | ||
- | public static void main(String args[]) { | ||
- | NonStaticOuterClass outer = new NonStaticOuterClass(5); | ||
- | NonStaticOuterClass outer1 = new NonStaticOuterClass(10); | ||
- | System.out.println(outer); | ||
- | System.out.println("#########################"); | ||
- | System.out.println(outer1); | ||
- | } | ||
- | } | ||
- | </code> | ||
- | |||
- | Από την μεταγλώττιση και εκτέλεση του παραπάνω κώδικα παρατηρούμε ότι αν και η κλάση //StaticInnerClass// δηλώνεται ως //static// μπορεί να δημιουργηθούν πολλαπλά αντικείμενα μέσα σε κάθε γονική κλάση. Τα αντικείμενα αυτά συνδέονται με το αντικείμενο της γονικής κλάσης και όχι με την γονική κλάση (όπως οι //static// μεταβλητές). | ||
- | |||
- | < |