java:local_inner_classes

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Τοπικές κλάσεις ====== Μπορείτε να ορίσετε μία τοπική κλάση μέσα σε οποιοδήποτε μπλοκ κώδικα, δηλαδή μέσα στο σώμα μίας μεθόδου μέσα σε στα άγκυστρα ενός //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> Στην **Java 8** ή μεταγενέστερα εισάγεται η έννοια της //effectively final// μεταβλητής. Ως //effectively final// ορίζεται κάθε τοπική μεταβλητή της οποίας η τιμή δεν μεταβάλλεται μετά την αρχικοποίηση της. </WRAP>

java/local_inner_classes.1430402157.txt.gz · Last modified: 2016/02/26 11:15 (external edit)