This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | Next revision Both sides next revision | ||
|
java:inner_class_access [2021/04/12 04:48] |
java:inner_class_access [2021/04/12 05:48] gthanos [Πρόσβαση από την εξωτερική κλάση σε πεδία της εσωτερικής κλάσης] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Προσβασιμότητα πεδίων και μεθόδων μεταξύ εσωτερικής και εξωτερικής κλάσης ====== | ||
| + | ===== Πρόσβαση στα πεδία της εξωτερικής κλάσης (από την εσωτερική κλάση) ===== | ||
| + | |||
| + | Κάθε εσωτερική κλάση έχει πρόσβαση στα πεδία και τις μεθόδους της εξωτερικής κλάσης, | ||
| + | |||
| + | <WRAP tip 80% round center> | ||
| + | Εάν μία μέθοδος της εσωτερικής κλάσης καλεί μία άλλη μέθοδο η οποία δεν ανήκει στην εσωτερική κλάση, τότε ο compiler αναζητά την μέθοδο στην εξωτερική κλάση. Αν δεν την βρει και στην εξωτερική κλάση τότε εμφανίζει μήνυμα λάθους. | ||
| + | |||
| + | Αντίστοιχα, | ||
| + | </ | ||
| + | |||
| + | Δείτε το παρακάτω παράδειγμα προσβασιμότητας των πεδίων της εξωτερικής κλάσης από την εσωτερική κλάση: | ||
| + | |||
| + | <code java OuterClassAccess.java> | ||
| + | public class OuterClassAccess { | ||
| + | private int outerPriv; | ||
| + | int outerPckgPriv; | ||
| + | protected int outerProt; | ||
| + | public int outerPub; | ||
| + | InnerClass ic; | ||
| + | | ||
| + | private void setOuterPriv(int v) { outerPriv = v; } | ||
| + | private int getOuterPriv() { return outerPriv; } | ||
| + | | ||
| + | void setOuterPckgPriv(int v) { outerPckgPriv = v; } | ||
| + | int getPckgOuterPriv() { return outerPckgPriv; | ||
| + | | ||
| + | protected void setOuterProt(int v) { outerProt = v; } | ||
| + | protected int getOuterProt() { return outerProt; } | ||
| + | | ||
| + | public void setOuterPub(int v) { outerPub = v; } | ||
| + | public int getOuterPub() { return outerPub; } | ||
| + | | ||
| + | public OuterClassAccess() { | ||
| + | ic = new InnerClass(1, | ||
| + | | ||
| + | } | ||
| + | | ||
| + | public String toString() { | ||
| + | return " | ||
| + | ", | ||
| + | } | ||
| + | | ||
| + | private class InnerClass { | ||
| + | //inner class has not fields | ||
| + | | ||
| + | public InnerClass(int p, int pp, int pr, int pu) { | ||
| + | outerPriv = p; | ||
| + | outerPckgPriv = pp; | ||
| + | outerProt = pr; | ||
| + | outerPub = pu; | ||
| + | } | ||
| + | | ||
| + | public void setOuterClassFields(int p, int pp, int pr, int pu) { | ||
| + | setOuterPriv(p); | ||
| + | setOuterPckgPriv(pp); | ||
| + | setOuterProt(pr); | ||
| + | setOuterPub(pu); | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | public static void main(String args[]) { | ||
| + | OuterClassAccess oc = new OuterClassAccess(); | ||
| + | System.out.println(oc); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP tip 80% center round> | ||
| + | Από το παραπάνω παράδειγμα, | ||
| + | </ | ||
| + | |||
| + | ===== Πρόσβαση από την εξωτερική κλάση σε πεδία της εσωτερικής κλάσης ===== | ||
| + | |||
| + | Το παρακάτω παράδειγμα εξηγεί την προσβασιμότητα της εξωτερικής κλάσης σε πεδία και μεθόδους της εσωτερικής κλάσης. | ||
| + | |||
| + | <code java AccessInnerClassFromOuterClass.java> | ||
| + | public class AccessInnerClassFromOuterClass { | ||
| + | int outer; | ||
| + | InnerOuterClass innerObj; | ||
| + | |||
| + | public AccessInnerClassFromOuterClass(int o) { | ||
| + | outer = o; | ||
| + | innerObj = new InnerOuterClass(); | ||
| + | innerObj.innerPriv = 10; | ||
| + | innerObj.innerProt = 20; | ||
| + | innerObj.innerPub = 30; | ||
| + | System.out.println(innerObj); | ||
| + | } | ||
| + | |||
| + | class InnerOuterClass { | ||
| + | private int innerPriv; | ||
| + | protected int innerProt; | ||
| + | public int innerPub; | ||
| + | | ||
| + | private void setInnerPriv(int priv) { innerPriv = priv; } | ||
| + | protected void setInnerProt(int prot) { innerProt = prot; } | ||
| + | public void setInnerPub(int pub) { innerPub = pub; } | ||
| + | public String toString() { | ||
| + | return " | ||
| + | ", | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | public static void main(String[] args) { | ||
| + | AccessInnerClassFromOuterClass outer = new AccessInnerClassFromOuterClass(5); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Όπως θα παρατηρήσετε αν μεταγλωττίσετε και εκτελέσετε το πρόγραμμα η εξωτερική κλάση έχει απόλυτη πρόσβαση στα πεδία και τις μεθόδους της εσωτερικής κλάσης ανεξάρτητα από τον προσδιοριστή πρόσβασης που έχουν αυτά. Η πρόσβαση της εξωτερικής κλάσης στα πεδία της εσωτερικής γίνεται πάντα μέσω ενός αντικειμένου της εξωτερικής κλάσης. | ||
| + | |||
| + | <WRAP tip 80% center round> | ||
| + | * H εσωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εξωτερικής κλάσης. | ||
| + | * Η εξωτερική κλάση έχει πρόσβαση σε όλα τα πεδία της εσωτερικής κλάσης. Η πρόσβαση στα πεδία αυτά γίνεται μέσω ενός αντικειμένου της εξωτερικής κλάσης. | ||
| + | |||
| + | Οι προσδιοριστές πρόσβασης **δεν εισάγουν κανένα περιορισμό** στον προσδιορισμό της προσβασιμότητας των πεδίων και των μεθόδων της εσωτερικής κλάσης από την εξωτερική κλάση και αντίστροφα. | ||
| + | </ | ||
| + | |||
| + | | Προηγούμενο : [[ : | ||