This shows you the differences between two versions of the page.
|
java:local_inner_classes [2015/04/30 13:55] gthanos [Πρόσβαση στις τοπικές μεταβλητές της μεθόδου] |
java:local_inner_classes [2016/02/26 11:15] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Τοπικές κλάσεις ====== | ||
| - | |||
| - | Μπορείτε να ορίσετε μία τοπική κλάση μέσα σε οποιοδήποτε μπλοκ κώδικα, δηλαδή μέσα στο σώμα μίας μεθόδου μέσα σε στα άγκυστρα ενός //if// statement ή μέσα στο σώμα μία εντολής ανακύκλωσης //for()// ή //while()//. Δείτε το παρακάτω παράδειγμα κώδικα. | ||
| - | |||
| - | <code java LocalClassExample.java> | ||
| - | public class LocalClassExample { | ||
| - | | ||
| - | String regularExpression = "[^0-9]"; | ||
| - | | ||
| - | public void validatePhoneNumber(/*final*/ String phoneNumber1,/*final*/ String phoneNumber2) { | ||
| - | | ||
| - | final int numberLength = 10; | ||
| - | |||
| - | class PhoneNumber { | ||
| - | | ||
| - | String formattedPhoneNumber = null; | ||
| - | |||
| - | PhoneNumber(String phoneNumber){ | ||
| - | regularExpression = "[^0-9]"; | ||
| - | // numberLength = 7; | ||
| - | String currentNumber = (phoneNumber).replaceAll( | ||
| - | regularExpression, ""); | ||
| - | if (currentNumber.length() == numberLength) | ||
| - | formattedPhoneNumber = currentNumber; | ||
| - | else | ||
| - | formattedPhoneNumber = null; | ||
| - | } | ||
| - | |||
| - | public String getNumber() { | ||
| - | return formattedPhoneNumber; | ||
| - | } | ||
| - | | ||
| - | // public void printOriginalNumbers() { | ||
| - | // System.out.println("Original numbers are " + phoneNumber1 + | ||
| - | // " and " + phoneNumber2); | ||
| - | // } | ||
| - | } | ||
| - | |||
| - | PhoneNumber myNumber1 = new PhoneNumber(phoneNumber1); | ||
| - | PhoneNumber myNumber2 = new PhoneNumber(phoneNumber2); | ||
| - | | ||
| - | // myNumber1.printOriginalNumbers(); | ||
| - | | ||
| - | if (myNumber1.getNumber() == null) | ||
| - | System.out.println("First number is invalid"); | ||
| - | else | ||
| - | System.out.println("First number is " + myNumber1.getNumber()); | ||
| - | if (myNumber2.getNumber() == null) | ||
| - | System.out.println("Second number is invalid"); | ||
| - | else | ||
| - | System.out.println("Second number is " + myNumber2.getNumber()); | ||
| - | |||
| - | } | ||
| - | |||
| - | public static void main(String... args) { | ||
| - | LocalClassExample lce = new LocalClassExample(); | ||
| - | lce.validatePhoneNumber("123-456-7890", "456-7890"); | ||
| - | } | ||
| - | } | ||
| - | </code> | ||
| - | ===== Πρόσβαση στα μέλη της εξωτερικής κλάσης από την τοπική κλάση ===== | ||
| - | |||
| - | Μία τοπική κλάση έχει πρόσβαση στα μέλη της εξωτερικής κλάσης. Στο προηγούμενο παράδειγμα, παρατηρήστε πως ο κατασκευαστής της κλάσης //PhoneNumber// έχει πρόσβαση στην μεταβλητή //**LocalClassExample.regularExpression**//. | ||
| - | |||
| - | ===== Πρόσβαση στις τοπικές μεταβλητές της μεθόδου ===== | ||
| - | |||
| - | Μία τοπική κλάση έχει πρόσβαση στις τοπικές μεταβλητές της μεθόδου μέσα στην οποία συνήθως ορίζεται μόνο αν αυτές έχουν οριστεί ως //final//. Δηλώνοντας μία μεταβλητή ως //final// δηλώνουμε ότι η τιμή αυτή δεν πρόκειται και δεν μπορεί να αλλάξει. Για παράδειγμα η μεταβλητή numberLength δηλώνεται //final// | ||
| - | <code java> | ||
| - | final int numberLength = 10; | ||
| - | </code> | ||
| - | Αν βγάλετε τα σχόλια από την γραμμή 15 ''numberLength = 7;'', θα παρατηρήσετε ότι λαμβάνετε το παρακάτω μήνυμα λάθους: | ||
| - | <code> | ||
| - | LocalClassExample.java:15: error: cannot assign a value to final variable numberLength | ||
| - | numberLength = 7; | ||
| - | </code> | ||
| - | |||
| - | Ομοίως αν προσθέσετε τους προσδιοριστές //final// στις παραμέτρους //**phoneNumber1**// και //**phoneNumber2**// τότε θα μπορείτε να εισάγετε την μέθοδο //**printOriginalNumbers**// οι οποία χρησιμοποιεί τις μεταβλητές αυτές. | ||
| - | |||
| - | <WRAP tip 80% center round> | ||
| - | Στην Java8 ή μεταγενέστερα εισάγεται η έννοια της effectively final μεταβλητής. Ως //**effectively final**// ορίζεται κάθε τοπική μεταβλητή της οποίας η τιμή δεν μεταβάλλεται μετά την αρχικοποίηση της. | ||
| - | </WRAP> | ||
| - | |||