This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
java:static_nested_classes [2015/04/30 11:49] gthanos |
java:static_nested_classes [2016/02/26 11:15] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Στατικές εμφωλευμένες κλάσεις ====== | ====== Στατικές εμφωλευμένες κλάσεις ====== | ||
| - | Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (**static**) με τις εξής ιδιαιτερότητες: | + | Μέχρι τώρα ορίσαμε στατικές μεθόδους και στατικές μεταβλητές, ως μεθόδους και μεταβλητές που ανήκουν στην κλάση. Οι εμφωλευμένες κλάσεις μπορούν να οριστούν και ως στατικές (**static**). Στατικές εμφωλευμένες κλάσεις είστε υποχρεωμένοι να ορίσετε στις παρακάτω περιπτώσεις: |
| - | * Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. | + | <WRAP important 80% center round> |
| + | * Οι μη στατικές εμφωλευμένες κλάσεις __δεν μπορούν__ να έχουν στατικά πεδία ή στατικές μεθόδους. Αν θέλετε να ορίσετε ένα στατικό πεδίο ή μέθοδο στην εμφωλευμένη κλάση θα πρέπει να την ορίσετε ως //static//. Προσπαθήστε να ορίσετε ένα στατικό πεδία μέσα σε μία μη στατική εμφωλευμένη κλάση και δείτε το μήνυμα του compiler. | ||
| * Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//. | * Αν θέλετε να δημιουργήσετε ένα αντικείμενο ή να καλέσετε μεθόδους της εμφωλευμένης κλάσης μέσα από μία στατική μέθοδο της εξωτερικής κλάσης θα πρέπει η εμφωλευμένη κλάση να έχει οριστεί ως //static//. | ||
| + | </WRAP> | ||
| - | Σημαντική ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι δεν έχουν απευθείας πρόσβαση στις μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν. Δείτε το παρακάτω παράδειγμα: | + | Δείτε το παρακάτω παράδειγμα: |
| <code java NonStaticOuterClass.java> | <code java NonStaticOuterClass.java> | ||
| Line 19: | Line 21: | ||
| innerObj = new StaticInnerClass(); | innerObj = new StaticInnerClass(); | ||
| innerObj.innerPriv = r.nextInt(10000); | innerObj.innerPriv = r.nextInt(10000); | ||
| + | innerObj.innerPub = r.nextInt(10000); | ||
| innerObj1 = new StaticInnerClass(); | innerObj1 = new StaticInnerClass(); | ||
| innerObj1.innerPriv = r.nextInt(10000); | innerObj1.innerPriv = r.nextInt(10000); | ||
| + | innerObj1.innerPub = r.nextInt(10000); | ||
| } | } | ||
| | | ||
| Line 35: | Line 39: | ||
| public void setInnerPub(int pub) { innerPub = pub; } | public void setInnerPub(int pub) { innerPub = pub; } | ||
| public String toString() { | public String toString() { | ||
| - | return "innerPub: "+innerPub; | + | return "innerPriv: "+innerPriv+", innerPub: "+innerPub; |
| } | } | ||
| } | } | ||
| } | } | ||
| </code> | </code> | ||
| + | |||
| + | Από την μεταγλώττιση και εκτέλεση του παραπάνω κώδικα παρατηρούμε ότι αν και η κλάση //StaticInnerClass// δηλώνεται ως //static// μπορεί να δημιουργηθούν πολλαπλά αντικείμενα της κλάσης αυτής. Επίσης, τα αντικείμενα αυτά __συνδέονται με το αντικείμενο της γονικής κλάσης και όχι με την γονική κλάση__ (όπως οι //static// μεταβλητές). | ||
| + | |||
| + | ===== Πρόσβαση στα στατικά και μη στατικά πεδία της εξωτερικής κλάσης ===== | ||
| + | |||
| + | Σημαντική επιπλέον ιδιαιτερότητα των //static// εμφωλευμένων κλάσεων είναι ότι __δεν έχουν απευθείας πρόσβαση στις μη-στατικές μεταβλητές της εξωτερικής κλάσης στην οποία ανήκουν__, **παρά μόνο στις στατικές μεταβλητές αυτής**. H πρόσβαση στις μη-στατικές μεταβλητές αυτής μπορεί να γίνει μέσα από ένα αντικείμενο της εξωτερικής κλάσης. | ||
| + | |||
| + | Δείτε το παρακάτω παράδειγμα. Παρατηρήστε πως μπορείτε να έχετε πρόσβαση στις μη στατικές μεταβλητές της εξωτερικής κλάσης μέσω ενός αντικειμένου της κλάσης αυτής. | ||
| + | |||
| + | <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() { | ||
| + | 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; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | ===== Δημιουργία αντικειμένων της στατικής κλάσης από μία τρίτη κλάση διαφορετική της εξωτερικής κλάσης ===== | ||
| + | |||
| + | Πως όμως μπορείτε να δημιουργήσετε αντικείμενα μίας εμφωλευμένης στατικής κλάσης μέσα σε μία άλλη κλάση, διαφορετική της εξωτερικής κλάσης; Δείτε το παρακάτω παράδειγμα κώδικα και παρατηρήστε την διαφορά σε σχέση με την δημιουργία αντικειιμένων που ανήκουν σε μη στατικές κλάσεις. | ||
| <code java TestNonStaticOuterClass.java> | <code java TestNonStaticOuterClass.java> | ||
| public class TestNonStaticOuterClass { | public class TestNonStaticOuterClass { | ||
| public static void main(String args[]) { | public static void main(String args[]) { | ||
| - | NonStaticOuterClass outer = new NonStaticOuterClass(5); | + | NonStaticOuterClass.StaticInnerClass inner = new NonStaticOuterClass.StaticInnerClass(); |
| - | NonStaticOuterClass outer1 = new NonStaticOuterClass(10); | + | inner.setInnerPub(6); |
| - | System.out.println(outer); | + | System.out.println(inner); |
| - | System.out.println("#########################"); | + | |
| - | System.out.println(outer1); | + | |
| } | } | ||
| } | } | ||
| </code> | </code> | ||
| - | Από την μεταγλώττιση και εκτέλεση του παραπάνω κώδικα παρατηρούμε ότι αν και η κλάση //StaticInnerClass// δηλώνεται ως //static// μπορεί να δημιουργηθούν πολλαπλά αντικείμενα μέσα σε κάθε γονική κλάση. Τα αντικείμενα αυτά συνδέονται με το αντικείμενο της γονικής κλάσης και όχι με την γονική κλάση (όπως οι //static// μεταβλητές). | + | |Προηγούμενο: [[ :java:nested_classes| Εμφωλευμένες κλάσεις ]] | Επόμενο: [[ :java:inner_classes | Μη στατικές εμφωλευμένες κλάσεις ]]| |
| + | |||
| - | < | ||