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:inner_classes [2016/02/11 20:41] gthanos |
java:inner_classes [2016/02/26 11:15] 127.0.0.1 external edit |
||
---|---|---|---|
Line 296: | Line 296: | ||
</code> | </code> | ||
- | Όπως θα παρατηρήσετε αν μεταγλωττίσετε και εκτελέσετε το πρόγραμμα η εξωτερική κλάση έχει απόλυτη πρόσβαση στα πεδία και τις μεθόδους της εσωτερικής κλάσης ανεξάρτητα από τον προσδιοριστή πρόσβασης που έχουν αυτά. | + | Όπως θα παρατηρήσετε αν μεταγλωττίσετε και εκτελέσετε το πρόγραμμα η εξωτερική κλάση έχει απόλυτη πρόσβαση στα πεδία και τις μεθόδους της εσωτερικής κλάσης ανεξάρτητα από τον προσδιοριστή πρόσβασης που έχουν αυτά. Η διαφορά ανάμεσα στην πρόσβαση της εξωτερικής κλάσης στα πεδία της εσωτερικής γίνεται μέσω ενός αντικειμένου της εξωτερικής κλάσης. |
<WRAP important 80% center round> | <WRAP important 80% center round> | ||
* H εσωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εξωτερικής κλάσης. | * H εσωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εξωτερικής κλάσης. | ||
- | * Η εξωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εσωτερικής κλάσης. | + | * Η εξωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εσωτερικής κλάσης. Η πρόσβαση στα πεδία αυτά γίνεται μέσω ενός αντικειμένου της εξωτερικής κλάσης. |
Οι προσδιοριστές πρόσβασης **δεν εισάγουν κανένα περιορισμό** στον προσδιορισμό της προσβασιμότητας των πεδίων και των μεθόδων της εσωτερικής κλάσης από την εξωτερική κλάση και αντίστροφα. | Οι προσδιοριστές πρόσβασης **δεν εισάγουν κανένα περιορισμό** στον προσδιορισμό της προσβασιμότητας των πεδίων και των μεθόδων της εσωτερικής κλάσης από την εξωτερική κλάση και αντίστροφα. | ||
</WRAP> | </WRAP> | ||
Line 311: | Line 311: | ||
public class OuterClass { | public class OuterClass { | ||
int outer; | int outer; | ||
- | InnerOuterClass innerObj; | + | InnerClass innerObj; |
public OuterClass(int o) { | public OuterClass(int o) { | ||
outer = o; | outer = o; | ||
- | innerObj = new InnerOuterClass(); | + | innerObj = new InnerClass(); |
innerObj.innerPriv = 10; | innerObj.innerPriv = 10; | ||
innerObj.innerProt = 20; | innerObj.innerProt = 20; | ||
Line 322: | Line 322: | ||
} | } | ||
- | class InnerOuterClass { | + | class InnerClass { |
private int innerPriv; | private int innerPriv; | ||
protected int innerProt; | protected int innerProt; | ||
Line 343: | Line 343: | ||
public static void main(String args[]) { | public static void main(String args[]) { | ||
OuterClass outer = new OuterClass(5); | OuterClass outer = new OuterClass(5); | ||
- | OuterClass.InnerOuterClass inner = outer.new InnerOuterClass(); | + | OuterClass.InnerClass inner = outer.new InnerClass(); |
inner.setInnerPriv(4); | inner.setInnerPriv(4); | ||
inner.setInnerProt(5); | inner.setInnerProt(5); | ||
Line 358: | Line 358: | ||
==== Χρήση προσδιοριστών πρόσβασης στην εσωτερική κλάση ==== | ==== Χρήση προσδιοριστών πρόσβασης στην εσωτερική κλάση ==== | ||
- | Στο προηγούμενο παράδειγμα δοκιμάστε να αλλάξετε τον προσδιοριστή πρόσβασης της κλάσης **InnerOuterClass** από package private σε private. Σε αυτή την περίπτωση θα παρατηρήσετε ότι η κλάση **TestOuterClass** δεν μεταγλωττίζεται. Συγκεκριμένα, o compiler εμφανίζει το παρακάτω μήνυμα λάθους, σημειώνοντας ότι ο προσδιοριστής πρόσβασης **private** δεν επιτρέπει τη πρόσβαση από μία άλλη κλάση στο συγκεκριμένο περιεχόμενο της **OuterClass**. Γενικότερα, ισχύουν οι κανόνες για τους προσδιοριστές πρόσβασης όπως αυτοί αναφέρονται [[java:access_modifiers|εδώ]]. | + | Στο προηγούμενο παράδειγμα δοκιμάστε να αλλάξετε τον προσδιοριστή πρόσβασης της κλάσης **InnerClass** από package private σε private. Σε αυτή την περίπτωση θα παρατηρήσετε ότι η κλάση **TestOuterClass** δεν μεταγλωττίζεται. Συγκεκριμένα, o compiler εμφανίζει το παρακάτω μήνυμα λάθους, σημειώνοντας ότι ο προσδιοριστής πρόσβασης **private** δεν επιτρέπει τη πρόσβαση από μία άλλη κλάση στο συγκεκριμένο περιεχόμενο της **OuterClass**. Γενικότερα, ισχύουν οι κανόνες για τους προσδιοριστές πρόσβασης όπως αυτοί αναφέρονται [[java:access_modifiers|εδώ]]. |
<code> | <code> | ||
Line 369: | Line 369: | ||
<WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
- | Το παραπάνω εξηγεί ικανοποιήτικα τον λόγο που πιθανόν να θέλετε να βάλετε ένα "περιοριστικό" προσδιοριστή πρόσβασης σε μία εσωτερική κλάση (συνήθως //private//). Ο λόγος είναι ότι με τον εν λόγο προσδιοριστή πρόσβασης αποκλείετε τη πρόσβαση στην εσωτερική κλάση από άλλες κλάσεις, κρύβοντας τον κώδικα που αφορά μόνο την συγκεκριμένη εξωτερική κλάση. | + | Το παραπάνω εξηγεί ικανοποιητικά τον τρόπο με τον οποίο μπορείτε να αποκλείσετε την πρόσβαση στην εσωτερική κλάση από άλλες κλάσεις πέραν της εξωτερικής. Ορίζοντας την εσωτερική κλάση ως **private** αυτή είναι προσβάσιμη μόνο από την εξωτερική της κλάση. |
</WRAP> | </WRAP> | ||
- | ==== Κρύβοντας τα πεδία της εξωτερικής κλάσης στην εσωτερική κλάση ==== | + | ==== Επαναορίζοντας (ή κρύβοντας..) τα πεδία της εξωτερικής κλάσης στην εσωτερική κλάση ==== |
Στο προηγούμενο παράδειγμα είδαμε την προσβασιμότητα στα πεδία και τις μεθόδους της εξωτερικής κλάσης. Τι γίνεται όμως όταν υπάρχει μία μέθοδος που καλεί μία άλλη μέθοδο η οποία υπάρχει τόσο στη εσωτερική όσο και στην εξωτερική κλάση. Σε αναλογία τι γίνεται όταν μία μέθοδος καλεί ένα πεδίο το οποίο υπάρχει στην εσωτερική και την εξωτερική κλάση; Το παρακάτω παράδειγμα απαντά στις παραπάνω απορίες. | Στο προηγούμενο παράδειγμα είδαμε την προσβασιμότητα στα πεδία και τις μεθόδους της εξωτερικής κλάσης. Τι γίνεται όμως όταν υπάρχει μία μέθοδος που καλεί μία άλλη μέθοδο η οποία υπάρχει τόσο στη εσωτερική όσο και στην εξωτερική κλάση. Σε αναλογία τι γίνεται όταν μία μέθοδος καλεί ένα πεδίο το οποίο υπάρχει στην εσωτερική και την εξωτερική κλάση; Το παρακάτω παράδειγμα απαντά στις παραπάνω απορίες. | ||
Line 407: | Line 407: | ||
</code> | </code> | ||
+ | |Προηγούμενο: [[ :java:static_nested_classes| Στατικές εμφωλευμένες κλάσεις ]] | Επόμενο: [[ :java:local_inner_classes | Τοπικές εμφωλευμένες κλάσεις ]]| |