java:local_inner_classes

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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> 
-Στην **Java 8** ή μεταγενέστερα εισάγεται η έννοια της //​effectively final// μεταβλητής. Ως //​effectively final// ορίζεται κάθε τοπική μεταβλητή της οποίας η τιμή δεν μεταβάλλεται μετά την αρχικοποίηση της. 
-</​WRAP>​ 
- 
  
java/local_inner_classes.txt · Last modified: 2016/02/26 11:15 (external edit)