This shows you the differences between two versions of the page.
|
java:static_nested_classes [2017/02/06 10:09] gthanos [Στατικές εμφωλευμένες κλάσεις] |
java:static_nested_classes [2020/03/16 09:55] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Στατικές εμφωλευμένες κλάσεις ====== | ||
| - | |||
| - | Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, | ||
| - | |||
| - | - Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. Προσπαθήστε να ορίσετε ένα στατικό πεδία μέσα σε μία μη στατική εμφωλευμένη κλάση και δείτε το μήνυμα του compiler. | ||
| - | - Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//. | ||
| - | |||
| - | Δείτε το παρακάτω παράδειγμα, | ||
| - | |||
| - | <code java NonStaticOuterClass.java> | ||
| - | public class NonStaticOuterClass { | ||
| - | static int outer; | ||
| - | StaticInnerClass innerObj; | ||
| - | |||
| - | 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); | ||
| - | } | ||
| - | | ||
| - | public String toString() { | ||
| - | | ||
| - | } | ||
| - | | ||
| - | public static class StaticInnerClass { | ||
| - | private int innerPriv; | ||
| - | protected int innerProt; | ||
| - | public int innerPub; | ||
| - | | ||
| - | private void setInnerPriv(int priv) { innerPriv = priv; } | ||
| - | public void setInnerProt(int prot) { innerProt = prot; } | ||
| - | public void setInnerPub(int pub) { innerPub = pub; } | ||
| - | | ||
| - | public String toString() { | ||
| - | return " | ||
| - | } | ||
| - | } | ||
| - | | ||
| - | public static void main(String args[]) { | ||
| - | NonStaticOuterClass myOuter = new NonStaticOuterClass(10); | ||
| - | System.out.println(myOuter.innerObj.toString()); | ||
| - | // | ||
| - | NonStaticOuterClass.StaticInnerClass inner = new NonStaticOuterClass.StaticInnerClass(); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | <WRAP tip 80% center round> | ||
| - | Από την μεταγλώττιση και εκτέλεση του παραπάνω κώδικα παρατηρούμε ότι | ||
| - | * αν και η κλάση // | ||
| - | * Τα αντικείμενα της στατικής εσωτερικής κλάσης ΔΕΝ ανήκουν στην εξωτερική κλάση, όπως συμβαίνει στις μη στατικές κλάσεις. Στο παραπάνω παράδειγμα, | ||
| - | * Η τελευταία γραμμή της μεθόδου **main** δείχνει ότι οι στατικές εσωτερικές κλάσεις μπορούν να οριστούν ανεξάρτητα από αντικείμενα της εξωτερικής τους κλάσης. Επιβεβαιώστε την αλήθεια του ισχυρισμού μεταγλωττίζοντας και εκτελώντας τον παραπάνω κώδικα. | ||
| - | </ | ||
| - | ===== Πρόσβαση στα στατικά και μη στατικά πεδία της εξωτερικής κλάσης ===== | ||
| - | |||
| - | Σημαντική επιπλέον ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι __δεν έχουν απευθείας πρόσβαση στις μη-στατικές μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν__, | ||
| - | |||
| - | Το παρακάτω παράδειγμα δείχνει ότι πως μπορείτε να έχετε πρόσβαση στις μη στατικές μεταβλητές της εξωτερικής κλάσης μέσω ενός αντικειμένου της κλάσης αυτής. | ||
| - | |||
| - | <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() { | ||
| - | | ||
| - | } | ||
| - | | ||
| - | 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; // comment out this line and compile again | ||
| - | } | ||
| - | | ||
| - | public String toString() { | ||
| - | return " | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ===== Δημιουργία αντικειμένων της εμφωλευμένης στατικής κλάσης από μία τρίτη κλάση διαφορετική της εξωτερικής κλάσης ===== | ||
| - | |||
| - | Πως όμως μπορείτε να δημιουργήσετε αντικείμενα μίας εμφωλευμένης στατικής κλάσης μέσα σε μία άλλη κλάση, διαφορετική της εξωτερικής κλάσης; | ||
| - | |||
| - | <code java TestNonStaticOuterClass.java> | ||
| - | public class TestNonStaticOuterClass { | ||
| - | public static void main(String args[]) { | ||
| - | NonStaticOuterClass.StaticInnerClass inner = new NonStaticOuterClass.StaticInnerClass(); | ||
| - | inner.setOuterClassDirectly(6); | ||
| - | System.out.println(inner); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | |Προηγούμενο: | ||
| - | |||
| - | |||