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:local_inner_classes [2015/04/30 13:38] gthanos [Πρόσβαση στα μέλη της εξωτερικής κλάσης] |
java:local_inner_classes [2015/04/30 13:55] gthanos [Πρόσβαση στις τοπικές μεταβλητές της μεθόδου] |
||
---|---|---|---|
Line 8: | Line 8: | ||
String regularExpression = "[^0-9]"; | String regularExpression = "[^0-9]"; | ||
| | ||
- | public void validatePhoneNumber(String phoneNumber1, String phoneNumber2) { | + | public void validatePhoneNumber(/*final*/ String phoneNumber1,/*final*/ String phoneNumber2) { |
| | ||
final int numberLength = 10; | final int numberLength = 10; | ||
Line 31: | Line 31: | ||
} | } | ||
| | ||
+ | // public void printOriginalNumbers() { | ||
+ | // System.out.println("Original numbers are " + phoneNumber1 + | ||
+ | // " and " + phoneNumber2); | ||
+ | // } | ||
} | } | ||
PhoneNumber myNumber1 = new PhoneNumber(phoneNumber1); | PhoneNumber myNumber1 = new PhoneNumber(phoneNumber1); | ||
PhoneNumber myNumber2 = new PhoneNumber(phoneNumber2); | PhoneNumber myNumber2 = new PhoneNumber(phoneNumber2); | ||
+ | | ||
+ | // myNumber1.printOriginalNumbers(); | ||
| | ||
if (myNumber1.getNumber() == null) | if (myNumber1.getNumber() == null) | ||
Line 53: | Line 59: | ||
} | } | ||
</code> | </code> | ||
- | + | ===== Πρόσβαση στα μέλη της εξωτερικής κλάσης από την τοπική κλάση ===== | |
- | ===== Πρόσβαση στα μέλη της εξωτερικής κλάσης ===== | + | |
Μία τοπική κλάση έχει πρόσβαση στα μέλη της εξωτερικής κλάσης. Στο προηγούμενο παράδειγμα, παρατηρήστε πως ο κατασκευαστής της κλάσης //PhoneNumber// έχει πρόσβαση στην μεταβλητή //**LocalClassExample.regularExpression**//. | Μία τοπική κλάση έχει πρόσβαση στα μέλη της εξωτερικής κλάσης. Στο προηγούμενο παράδειγμα, παρατηρήστε πως ο κατασκευαστής της κλάσης //PhoneNumber// έχει πρόσβαση στην μεταβλητή //**LocalClassExample.regularExpression**//. | ||
- | In addition, a local class has access to local variables. However, a local class can only access local variables that are declared final. When a local class accesses a local variable or parameter of the enclosing block, it captures that variable or parameter. For example, the PhoneNumber constructor can access the local variable numberLength because it is declared final; numberLength is a captured variable. | + | ===== Πρόσβαση στις τοπικές μεταβλητές της μεθόδου ===== |
- | Επιπρόσθετα, μία τοπική κλάση έχει πρόσβαση στις τοπικές μεταβλητές της μεθόδου μέσα στην οποία συνήθως ορίζεται μόνο αν αυτές έχουν οριστεί ως //final//. Δηλώνοντας μία μεταβλητή ως //final// δηλώνουμε ότι η τιμή αυτή δεν πρόκειται και δεν μπορεί να αλλάξει. Αν βγάλετε τα σχόλια από την γραμμή 15, | + | Μία τοπική κλάση έχει πρόσβαση στις τοπικές μεταβλητές της μεθόδου μέσα στην οποία συνήθως ορίζεται μόνο αν αυτές έχουν οριστεί ως //final//. Δηλώνοντας μία μεταβλητή ως //final// δηλώνουμε ότι η τιμή αυτή δεν πρόκειται και δεν μπορεί να αλλάξει. Για παράδειγμα η μεταβλητή numberLength δηλώνεται //final// |
- | <code java>//numberLength = 7;</code> | + | <code java> |
- | θα παρατηρήσετε ότι λαμβένετε το παρακάτω μήνυμα λάθους | + | final int numberLength = 10; |
+ | </code> | ||
+ | Αν βγάλετε τα σχόλια από την γραμμή 15 ''numberLength = 7;'', θα παρατηρήσετε ότι λαμβάνετε το παρακάτω μήνυμα λάθους: | ||
<code> | <code> | ||
LocalClassExample.java:15: error: cannot assign a value to final variable numberLength | LocalClassExample.java:15: error: cannot assign a value to final variable numberLength | ||
numberLength = 7; | numberLength = 7; | ||
</code> | </code> | ||
+ | |||
+ | Ομοίως αν προσθέσετε τους προσδιοριστές //final// στις παραμέτρους //**phoneNumber1**// και //**phoneNumber2**// τότε θα μπορείτε να εισάγετε την μέθοδο //**printOriginalNumbers**// οι οποία χρησιμοποιεί τις μεταβλητές αυτές. | ||
+ | |||
+ | <WRAP tip 80% center round> | ||
+ | Στην Java8 ή μεταγενέστερα εισάγεται η έννοια της effectively final μεταβλητής. Ως // ** effectively final ** // ορίζεται κάθε τοπική μεταβλητή της οποίας η τιμή δεν μεταβάλλεται μετά την αρχικοποίηση της. | ||
+ | </WRAP> | ||