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 [2015/04/30 13:30]
gthanos [Πρόσβαση στα μέλη της εξωτερικής κλάσης]
java:local_inner_classes [2021/04/12 05:54]
gthanos [Τοπικές κλάσεις]
Line 1: Line 1:
 ====== Τοπικές κλάσεις ====== ====== Τοπικές κλάσεις ======
  
-Μπορείτε να ορίσετε μία τοπική κλάση μέσα σε οποιοδήποτε μπλοκ κώδικα, δηλαδή μέσα στο σώμα μίας μεθόδου μέσα σε στα άγκυστρα ενός //if// statement ή μέσα στο σώμα μία εντολής ανακύκλωσης //for()// ή //while()//. Δείτε το παρακάτω παράδειγμα κώδικα. 
  
-<code java LocalClassExample.java>  +Μπορείτε να ορίσετε μία κλάση μέσα σε οποιοδήποτε μπλοκ κώδικα, δηλαδή μέσα στο σώμα μίας μεθόδου μέσα σε στα άγκιστρα ενός //if// statement ή μέσα στο σώμα μία εντολής ανακύκλωσης //for()// ή //while()//. Η συγκεκριμένη κατηγορία κλάσεων ονομάζεται **τοπικη κλάση**.  
-public class LocalClassExample {+ 
 +Ο λόγος που πιθανόν θέλει κάποιος προγραμματιστής να ορίσει μία τοπική κλάση είναι ότι η λειτουργικότητα που υλοποιεί η τοπική κλάση αφορά μόνο τη συγκεκριμένη μέθοδο μέσα στην οποία δηλώνεται.  
 + 
 +Δείτε το παρακάτω παράδειγμα κώδικα. 
 + 
 +<code java ValidatePhoneNumberUsingLocalClass.java>  
 +  
 +public class ValidatePhoneNumberUsingLocalClass {
      
-  String regularExpression = "[^0-9]";+  static String regularExpression = "[^0-9]";
      
-  public void validatePhoneNumber(String phoneNumber1, String phoneNumber2) {+  public static void validatePhoneNumber(String number) {
          
     final int numberLength = 10;     final int numberLength = 10;
Line 14: Line 20:
     class PhoneNumber {     class PhoneNumber {
              
-      String formattedPhoneNumber = null;+      private String formattedPhoneNumber = null;
  
       PhoneNumber(String phoneNumber){               PhoneNumber(String phoneNumber){        
         regularExpression = "[^0-9]";         regularExpression = "[^0-9]";
-        // numberLength = 7; +        String currentNumber = phoneNumber.replaceAll(
-        String currentNumber = (phoneNumber).replaceAll(+
           regularExpression, "");           regularExpression, "");
         if (currentNumber.length() == numberLength)         if (currentNumber.length() == numberLength)
Line 31: Line 36:
       }       }
              
 +      public String toString() {
 +        if(formattedPhoneNumber == null)
 +          return "Invalid number\n";
 +        else
 +          return formattedPhoneNumber;
 +      }
 +      
 +      //    public void printOriginalNumbers() {
 +      //      System.out.println("Original numbers are " + phoneNumber1 +
 +      //          " and " + phoneNumber2);
 +      //    }
     }     }
  
-    PhoneNumber myNumber1 = new PhoneNumber(phoneNumber1); +    //  myNumber1.printOriginalNumbers(); 
-    PhoneNumber myNumber2 = new PhoneNumber(phoneNumber2); +    System.out.println(number + "+ new PhoneNumber(number));
-     +
-    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) {   public static void main(String... args) {
-    LocalClassExample lce = new LocalClassExample(); +    ValidatePhoneNumberUsingLocalClass.validatePhoneNumber("123-456-7890"); 
-    lce.validatePhoneNumber("123-456-7890""456-7890");+    ValidatePhoneNumberUsingLocalClass.validatePhoneNumber("456-7890");
   }   }
 } }
 </code> </code>
- +===== Πρόσβαση στα μέλη της εξωτερικής κλάσης από την τοπική κλάση =====
-===== Πρόσβαση στα μέλη της εξωτερικής κλάσης =====+
  
 Μία τοπική κλάση έχει πρόσβαση στα μέλη της εξωτερικής κλάσης. Στο προηγούμενο παράδειγμα, παρατηρήστε πως ο κατασκευαστής της κλάσης //PhoneNumber// έχει πρόσβαση στην μεταβλητή //**LocalClassExample.regularExpression**//. Μία τοπική κλάση έχει πρόσβαση στα μέλη της εξωτερικής κλάσης. Στο προηγούμενο παράδειγμα, παρατηρήστε πως ο κατασκευαστής της κλάσης //PhoneNumber// έχει πρόσβαση στην μεταβλητή //**LocalClassExample.regularExpression**//.
  
 +===== Πρόσβαση στις τοπικές μεταβλητές της μεθόδου =====
 +
 +Μία τοπική κλάση έχει πρόσβαση στις τοπικές μεταβλητές της μεθόδου μέσα στην οποία συνήθως ορίζεται μόνο αν αυτές έχουν οριστεί ως //final//. Δηλώνοντας μία μεταβλητή ως //final// δηλώνουμε ότι η τιμή αυτή δεν πρόκειται και δεν μπορεί να αλλάξει. Για παράδειγμα η μεταβλητή numberLength δηλώνεται //final// 
 +<code java>
 +final int numberLength = 10;
 +</code>
 +
 +Αν προσθέσετε τους προσδιοριστές //final// στις παραμέτρους //**phoneNumber1**// και //**phoneNumber2**// τότε θα μπορείτε να εισάγετε την μέθοδο //**printOriginalNumbers**// οι οποία χρησιμοποιεί τις μεταβλητές αυτές.
 +
 +<WRAP tip 80% center round>
 +Στην **Java 8** και μεταγενέστερα εισάγεται η έννοια της //effectively final// μεταβλητής. Ως //effectively final// ορίζεται κάθε τοπική μεταβλητή της οποίας η τιμή δεν μεταβάλλεται μετά την αρχικοποίηση της. Ο μεταγλωττιστής είναι αρκετά "έξυπνος" για να αντιληφθεί ότι η τιμή της μεταβλητής δεν μεταβάλλεται ακόμη και εάν δεν οριστεί ως //final//.
 +</WRAP>
  
 +|Προηγούμενο: [[ :java:inner_class_inheritance | Κληρονομικότητα εσωτερικών κλάσεων  ]] | Επόμενο: [[ :java:anon_inner_classes | Ανώνυμες εμφωλευμένες κλάσεις ]]|
java/local_inner_classes.txt · Last modified: 2021/04/12 04:54 (external edit)