User Tools

Site Tools


java:local_inner_classes

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:local_inner_classes [2017/04/03 00:05]
gthanos [Τοπικές κλάσεις]
java:local_inner_classes [2021/04/12 04:54]
Line 1: Line 1:
-====== Τοπικές κλάσεις ====== 
  
-Μπορείτε να ορίσετε μία κλάση μέσα σε οποιοδήποτε μπλοκ κώδικα, δηλαδή μέσα στο σώμα μίας μεθόδου μέσα σε στα άγκιστρα ενός //if// statement ή μέσα στο σώμα μία εντολής ανακύκλωσης //for()// ή //while()//. Η συγκεκριμένη κατηγορία κλάσεων ονομάζεται **τοπικη κλάση**.  
- 
-Ο λόγος που πιθανόν θέλει κάποιος προγραμματιστής να ορίσει μία τοπική κλάση είναι ότι η λειτουργικότητα που υλοποιεί η τοπική κλάση αφορά μόνο τη συγκεκριμένη μέθοδο μέσα στην οποία δηλώνεται.  
- 
-Δείτε το παρακάτω παράδειγμα κώδικα. 
- 
-<code java LocalClassExample.java>  
-public class LocalClassExample { 
-   
-  static String regularExpression = "[^0-9]"; 
-   
-  public static void validatePhoneNumber(String number1,String number2) { 
-     
-    final int numberLength = 10; 
-      
-    class PhoneNumber { 
-       
-      private String formattedPhoneNumber = null; 
- 
-      PhoneNumber(String phoneNumber){         
-        regularExpression = "[^0-9]"; 
-        String currentNumber = phoneNumber.replaceAll( 
-          regularExpression, ""); 
-        if (currentNumber.length() == numberLength) 
-          formattedPhoneNumber = currentNumber; 
-        else 
-          formattedPhoneNumber = null; 
-      } 
- 
-      public String getNumber() { 
-        return formattedPhoneNumber; 
-      } 
-       
-      public String toString() { 
-        if(formattedPhoneNumber == null) 
-          return "Invalid number\n"; 
-        else 
-          return formattedPhoneNumber; 
-      } 
-    } 
- 
-    System.out.println(number1 + ": " + new PhoneNumber(number1)); 
-    System.out.println(number2 + ": " + new PhoneNumber(number2)); 
-  } 
- 
-  public static void main(String... args) { 
-    LocalClassExample.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// ορίζεται κάθε τοπική μεταβλητή της οποίας η τιμή δεν μεταβάλλεται μετά την αρχικοποίηση της. Ο μεταγλωττιστής είναι αρκετά "έξυπνος" για να αντιληφθεί ότι η τιμή της μεταβλητής δεν μεταβάλλεται ακόμη και εάν δεν οριστεί ως //final//. 
-</WRAP> 
- 
-|Προηγούμενο: [[ :java:inner_classes| Μη στατικές εμφωλευμένες κλάσεις   ]] | Επόμενο: [[ :java:anon_inner_classes | Ανώνυμες εμφωλευμένες κλάσεις ]]| 
java/local_inner_classes.txt · Last modified: 2021/04/12 04:54 (external edit)