This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
java:static_nested_classes [2015/04/30 11:58] gthanos |
java:static_nested_classes [2017/02/06 13:06] gthanos [Δημιουργία αντικειμένων της εμφωλευμένης στατικής κλάσης από μία τρίτη κλάση διαφορετική της εξωτερικής κλάσης] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Στατικές εμφωλευμένες κλάσεις ====== | ====== Στατικές εμφωλευμένες κλάσεις ====== | ||
| - | Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, | + | Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, |
| - | <WRAP important 80% center round> | + | - Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. Προσπαθήστε να ορίσετε ένα στατικό πεδία μέσα σε μία μη στατική εμφωλευμένη κλάση και δείτε το μήνυμα του compiler. |
| - | * Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως // | + | |
| - | | + | |
| - | </ | + | |
| - | Σημαντική ιδιαιτερότητα των //static// εμφωλευμένων | + | Δείτε το παρακάτω παράδειγμα, όπου η εσωτερική στατική |
| <code java NonStaticOuterClass.java> | <code java NonStaticOuterClass.java> | ||
| Line 14: | Line 12: | ||
| static int outer; | static int outer; | ||
| StaticInnerClass innerObj; | StaticInnerClass innerObj; | ||
| - | StaticInnerClass innerObj1; | ||
| public NonStaticOuterClass(int o) { | public NonStaticOuterClass(int o) { | ||
| Line 22: | Line 19: | ||
| innerObj.innerPriv = r.nextInt(10000); | innerObj.innerPriv = r.nextInt(10000); | ||
| innerObj.innerPub = r.nextInt(10000); | innerObj.innerPub = r.nextInt(10000); | ||
| - | innerObj1 = new StaticInnerClass(); | ||
| - | innerObj1.innerPriv = r.nextInt(10000); | ||
| - | innerObj1.innerPub = r.nextInt(10000); | ||
| } | } | ||
| | | ||
| public String toString() { | public String toString() { | ||
| - | | + | |
| } | } | ||
| | | ||
| Line 37: | Line 31: | ||
| | | ||
| private void setInnerPriv(int priv) { innerPriv = priv; } | private void setInnerPriv(int priv) { innerPriv = priv; } | ||
| + | public void setInnerProt(int prot) { innerProt = prot; } | ||
| public void setInnerPub(int pub) { innerPub = pub; } | public void setInnerPub(int pub) { innerPub = pub; } | ||
| + | | ||
| public String toString() { | public String toString() { | ||
| - | return " | + | 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> | <code java TestNonStaticOuterClass.java> | ||
| Line 53: | Line 103: | ||
| public static void main(String args[]) { | public static void main(String args[]) { | ||
| NonStaticOuterClass.StaticInnerClass inner = new NonStaticOuterClass.StaticInnerClass(); | NonStaticOuterClass.StaticInnerClass inner = new NonStaticOuterClass.StaticInnerClass(); | ||
| - | inner.setInnerPub(6); | + | inner.setOuterClassDirectly(6); |
| System.out.println(inner); | System.out.println(inner); | ||
| } | } | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | |Προηγούμενο: | ||
| + | |||