java:anon_inner_classes
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:anon_inner_classes [2018/03/21 09:45] – [Ανώνυμες εμφωλευμένες κλάσεις] gthanos | java:anon_inner_classes [2023/03/23 20:43] (current) – [Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως υλοποίηση ενός interface] gthanos | ||
---|---|---|---|
Line 4: | Line 4: | ||
Ανώνυμες εμφωλευμένες κλάσεις μπορούμε να υλοποιήσουμε όταν συντρέχουν ταυτόχρονα οι παρακάτω λόγοι: | Ανώνυμες εμφωλευμένες κλάσεις μπορούμε να υλοποιήσουμε όταν συντρέχουν ταυτόχρονα οι παρακάτω λόγοι: | ||
- | - επιθυμούμε την υλοποίηση εσωτερικής κλάσης. | + | - θέλουμε να υλοποιήσουμε μία |
- | - η κλάση αυτή υλοποιεί ένα interface ή επεκτείνει μία άλλη κλάση (η κλάση που επεκτείνεται μπορεί να είναι abstract ή όχι) και | + | - η κλάση αυτή υλοποιεί ένα |
- από την κλάση αυτή επιθυμούμε να δημιουργηθεί μόνο ένα αντικείμενο. | - από την κλάση αυτή επιθυμούμε να δημιουργηθεί μόνο ένα αντικείμενο. | ||
- | Σε αυτές τις περιπτώσεις η χρήση ανώνυμων κλάσεων μπορεί να είναι βολική, | + | Σε αυτές τις περιπτώσεις η χρήση ανώνυμων κλάσεων μπορεί να είναι βολική, |
===== Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως υλοποίηση ενός interface ===== | ===== Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως υλοποίηση ενός interface ===== | ||
- | Στο παρακάτω παράδειγμα ορίζουμε την κλάση **Student** η οποία έχει τα τρία (3) πεδία **firstName**, | + | Στο παρακάτω παράδειγμα ορίζουμε την κλάση **Student** η οποία έχει τα τρία (3) πεδία **firstName**, |
- | + | ||
- | <code txt students.txt> | + | |
- | 4596 Super Man | + | |
- | 5819 Peter Pan | + | |
- | 1694 Susan Brown | + | |
- | 7895 Lena Smith | + | |
- | 3256 Oscar Gonzales | + | |
- | 1243 Edgar Wallace | + | |
- | 3265 Kate Gordon | + | |
- | 4377 Leda Evans | + | |
- | 1118 David Lerroy | + | |
- | 8744 Amelia Dray | + | |
- | </ | + | |
<code java Student.java> | <code java Student.java> | ||
Line 48: | Line 35: | ||
| | ||
// First anonymous comparator class | // First anonymous comparator class | ||
- | Comparator< | + | |
public int compare(Student st1, Student st2) { | public int compare(Student st1, Student st2) { | ||
int cmp = st1.lastName.compareTo(st2.lastName); | int cmp = st1.lastName.compareTo(st2.lastName); | ||
Line 56: | Line 43: | ||
cmp = st1.AEM - st2.AEM; | cmp = st1.AEM - st2.AEM; | ||
return cmp; | return cmp; | ||
- | } | ||
- | public boolean equals(Object o) { | ||
- | if(o instanceof Student) { | ||
- | Student st = (Student) o; | ||
- | if(firstName.equals(st.firstName) && lastName.equals(st.lastName) && AEM == st.AEM) | ||
- | return true; | ||
- | } | ||
- | return false; | ||
} | } | ||
}; | }; | ||
+ | public static void sortLexicographically(List< | ||
+ | Collections.sort(students, | ||
+ | } | ||
+ | | ||
+ | public static void sortByAEM(List< | ||
+ | // Second anonymous comparator class | ||
+ | Collections.sort(students, | ||
+ | public int compare(Student st1, Student st2) { | ||
+ | int cmp = st1.AEM - st2.AEM; | ||
+ | if(cmp==0) | ||
+ | cmp = st1.lastName.compareTo(st2.lastName); | ||
+ | if(cmp==0) | ||
+ | cmp = st1.firstName.compareTo(st2.firstName); | ||
+ | return cmp; | ||
+ | } | ||
+ | } | ||
+ | ); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Στη μέθοδο **// | ||
+ | * με τη σειρά που τα διαβάσαμε | ||
+ | * με λεξικογραφική σειρά. | ||
+ | * με βάση το ΑΕΜ | ||
+ | |||
+ | <code txt students.txt> | ||
+ | 4596 Super Man | ||
+ | 5819 Peter Pan | ||
+ | 1694 Susan Brown | ||
+ | 7895 Lena Smith | ||
+ | 3256 Oscar Gonzales | ||
+ | 1243 Edgar Wallace | ||
+ | 3265 Kate Gordon | ||
+ | 4377 Leda Evans | ||
+ | 1118 David Lerroy | ||
+ | 8744 Amelia Dray | ||
+ | </ | ||
+ | |||
+ | <code java SortListOfStudents.java> | ||
+ | import java.io.*; | ||
+ | import java.util.*; | ||
+ | |||
+ | public class SortListOfStudents { | ||
+ | | ||
public static void readFromFile(List< | public static void readFromFile(List< | ||
try(Scanner sc = new Scanner(f)) { | try(Scanner sc = new Scanner(f)) { | ||
Line 81: | Line 105: | ||
System.exit(-1); | System.exit(-1); | ||
} | } | ||
- | } | ||
- | | ||
- | public void sortLexicographically(List< | ||
- | Collections.sort(students, | ||
- | } | ||
- | | ||
- | public void sortByAEM(List< | ||
- | // Second anonymous comparator class | ||
- | Collections.sort(students, | ||
- | public int compare(Student st1, Student st2) { | ||
- | int cmp = cmp = st1.AEM - st2.AEM; | ||
- | if(cmp==0) | ||
- | cmp = st1.lastName.compareTo(st2.lastName); | ||
- | if(cmp==0) | ||
- | cmp = st1.firstName.compareTo(st2.firstName); | ||
- | return cmp; | ||
- | } | ||
- | public boolean equals(Object o) { | ||
- | if(o instanceof Student) { | ||
- | Student st = (Student) o; | ||
- | if(firstName.equals(st.firstName) && lastName.equals(st.lastName) && AEM == st.AEM) | ||
- | return true; | ||
- | } | ||
- | return false; | ||
- | } | ||
- | } | ||
- | ); | ||
} | } | ||
| | ||
public static String toString(List< | public static String toString(List< | ||
- | | + | |
for(Student st : students) | for(Student st : students) | ||
str.append(st+" | str.append(st+" | ||
Line 127: | Line 124: | ||
System.out.println(" | System.out.println(" | ||
System.out.println(toString(students)); | System.out.println(toString(students)); | ||
- | | + | |
System.out.println(" | System.out.println(" | ||
System.out.println(toString(students)); | System.out.println(toString(students)); | ||
- | | + | |
System.out.println(" | System.out.println(" | ||
System.out.println(toString(students)); | System.out.println(toString(students)); | ||
} | } | ||
- | | ||
} | } | ||
</ | </ | ||
+ | |||
===== Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως επέκταση υφιστάμενης κλάσης ===== | ===== Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως επέκταση υφιστάμενης κλάσης ===== | ||
+ | Δείτε το προηγούμενο παράδειγμα παραλλαγμένο ως εξής. Αρχικά φτιάχνουμε την εσωτερική // | ||
- | Παρακάτω δίνεται ένα άλλο παράδειγμα, | + | <code java Student.java> |
+ | import java.util.Comparator; | ||
+ | import java.util.*; | ||
+ | import java.io.*; | ||
- | <code java HelloWorldAnonymousClasses.java> | + | class Student { |
- | public | + | String firstName; |
+ | String lastName; | ||
+ | int AEM; | ||
+ | |||
+ | public Student(int AEM, String firstName, String lastName) { | ||
+ | this.firstName = firstName; | ||
+ | | ||
+ | this.AEM = AEM; | ||
+ | } | ||
+ | |||
+ | | ||
+ | return String.format(" | ||
+ | } | ||
| | ||
- | | + | |
- | public void greet(); | + | |
- | public void greetSomeone(String someone); | + | |
} | } | ||
+ | | ||
+ | static Comparator< | ||
+ | public int compare(Student st1, Student st2) { | ||
+ | int cmp = st1.lastName.compareTo(st2.lastName); | ||
+ | if(cmp==0) | ||
+ | cmp = st1.firstName.compareTo(st2.firstName); | ||
+ | if(cmp==0) | ||
+ | cmp = st1.AEM - st2.AEM; | ||
+ | return cmp; | ||
+ | } | ||
+ | }; | ||
| | ||
- | public static void sayHello() { | + | public static void sortLexicographically(List< |
+ | Collections.sort(students, | ||
+ | } | ||
| | ||
- | class EnglishGreeting implements HelloWorld | + | public static void sortByAEM(List< |
- | | + | |
- | public | + | public |
- | | + | int cmp = cmp = st1.AEM - st2.AEM; |
+ | if(cmp==0) | ||
+ | cmp = st1.lastName.compareTo(st2.lastName); | ||
+ | if(cmp==0) | ||
+ | cmp = st1.firstName.compareTo(st2.firstName); | ||
+ | return cmp; | ||
+ | } | ||
} | } | ||
- | public void greetSomeone(String someone) { | + | |
- | name = someone; | + | } |
- | System.out.println(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | HelloWorld englishGreeting = new EnglishGreeting(); | + | |
- | + | ||
- | HelloWorld frenchGreeting = new HelloWorld() { | + | |
- | String name = "tout le monde"; | + | |
- | public void greet() { | + | |
- | greetSomeone(" | + | |
- | } | + | |
- | public void greetSomeone(String someone) { | + | |
- | name = someone; | + | |
- | System.out.println(" | + | |
- | } | + | |
- | }; | + | |
- | + | ||
- | HelloWorld spanishGreeting = new EnglishGreeting() { | + | |
- | String name = " | + | |
- | public void greet() { | + | |
- | greetSomeone(" | + | |
- | } | + | |
- | public void greetSomeone(String someone) { | + | |
- | name = someone; | + | |
- | System.out.println(" | + | |
- | } | + | |
- | }; | + | |
- | englishGreeting.greet(); | + | |
- | frenchGreeting.greetSomeone(" | + | |
- | spanishGreeting.greet(); | + | |
- | } | + | |
- | + | ||
- | public static void main(String... args) { | + | |
- | HelloWorldAnonymousClasses.sayHello(); | + | |
- | } | + | |
} | } | ||
</ | </ | ||
- | |||
- | <WRAP tip 80% center round> | ||
- | Παρατηρήστε ότι η μεταβλητή // | ||
- | </ | ||
===== Πρόσβαση στις τοπικές μεταβλητές και στις μεταβλητές της εξωτερικής κλάσης ===== | ===== Πρόσβαση στις τοπικές μεταβλητές και στις μεταβλητές της εξωτερικής κλάσης ===== | ||
- | Σε αναλογία με τις [[java: | + | Σε αναλογία με τις [[java: |
* Η ανώνυμη κλάση έχει πρόσβαση στις μεταβλητές της εξωτερικής κλάσης. | * Η ανώνυμη κλάση έχει πρόσβαση στις μεταβλητές της εξωτερικής κλάσης. | ||
- | * Η ανώνυμη κλάση δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές της μεθόδου στην οποία ορίζονται αν αυτές δεν έχουν δηλωθεί ως //final//. | + | * Η ανώνυμη κλάση δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές της μεθόδου στην οποία ορίζεται αν αυτές δεν έχουν δηλωθεί ως //final//. |
* Όπως σε όλες τις μη στατικές εμφωλευμένες κλάσεις ο ορισμός του ίδιου τύπου δεδομένων στην εσωτερική και την εξωτερική κλάση "// | * Όπως σε όλες τις μη στατικές εμφωλευμένες κλάσεις ο ορισμός του ίδιου τύπου δεδομένων στην εσωτερική και την εξωτερική κλάση "// | ||
- | * Δεν μπορείτε να ορίσετε στατικές μεταβλητές ή μεθόδους μέσα σε μία ανώνυμη κλάση. | + | * __Δεν μπορείτε__ να ορίσετε στατικές μεταβλητές ή μεθόδους μέσα σε μία ανώνυμη κλάση. |
Σε μία ανώνυμη κλάση μπορείτε να ορίσετε τα εξής: | Σε μία ανώνυμη κλάση μπορείτε να ορίσετε τα εξής: | ||
* Πεδία | * Πεδία | ||
- | * Επιπλέον μεθόδους που δεν ορίζονται στη interface ή στην κλάση που επεκτείνει. | + | * Επιπλέον μεθόδους που δεν ορίζονται στο interface ή στην κλάση που επεκτείνεται. |
- | * Μεθόδους ή block αρχικοποίησης πεδίων της κλάσης. | + | |
* Τοπικές κλάσεις που ανήκουν στη ανώνυμη κλάση. | * Τοπικές κλάσεις που ανήκουν στη ανώνυμη κλάση. | ||
* **ΔΕΝ** μπορείτε και __δεν έχει νόημα__ να ορίσετε κατασκευαστές μέσα σε μία ανώνυμη κλάση. | * **ΔΕΝ** μπορείτε και __δεν έχει νόημα__ να ορίσετε κατασκευαστές μέσα σε μία ανώνυμη κλάση. | ||
| Προηγούμενο : [[ : | | Προηγούμενο : [[ : |
java/anon_inner_classes.1521625502.txt.gz · Last modified: 2018/03/21 09:45 by gthanos