This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
java:anon_inner_classes [2017/02/06 08:34] gthanos [Ανώνυμες εμφωλευμένες κλάσεις] |
java:anon_inner_classes [2021/04/12 06:22] gthanos [Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως υλοποίηση ενός interface] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Ανώνυμες εμφωλευμένες κλάσεις ====== | ====== Ανώνυμες εμφωλευμένες κλάσεις ====== | ||
| - | Οι ανώνυμές εμφωλευμένες κλάσεις επιτρέπουν τον ταυτόχρονο ορισμό της κλάσης και την δημιουργία ενός αντικειμένου, | + | Οι ανώνυμές εμφωλευμένες κλάσεις επιτρέπουν τον ταυτόχρονο ορισμό της κλάσης και την δημιουργία ενός αντικειμένου, |
| Ανώνυμες εμφωλευμένες κλάσεις μπορούμε να υλοποιήσουμε όταν συντρέχουν ταυτόχρονα οι παρακάτω λόγοι: | Ανώνυμες εμφωλευμένες κλάσεις μπορούμε να υλοποιήσουμε όταν συντρέχουν ταυτόχρονα οι παρακάτω λόγοι: | ||
| - | - επιθυμούμε την υλοποίηση εσωτερικής κλάσης. | + | - θέλουμε να υλοποιήσουμε μία |
| - | - η κλάση αυτή υλοποιεί ένα interface ή επεκτείνει μία άλλη κλάση (η κλάση που επεκτείνεται μπορεί να είναι abstract ή όχι) και | + | - η κλάση αυτή υλοποιεί ένα |
| - | - από την κλάση αυτή | + | - από την κλάση αυτή επιθυμούμε |
| - | Σε αυτές τις περιπτώσεις η χρήση ανώνυμων κλάσεων μπορεί να είναι βολική, | + | Σε αυτές τις περιπτώσεις η χρήση ανώνυμων κλάσεων μπορεί να είναι βολική, |
| - | <code java DataStructure.java> | + | ===== Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως υλοποίηση ενός interface ===== |
| - | public | + | |
| + | Στο παρακάτω παράδειγμα ορίζουμε την κλάση **Student** η οποία έχει τα τρία (3) πεδία **firstName**, | ||
| + | |||
| + | <code java Student.java> | ||
| + | import java.util.Comparator; | ||
| + | import java.util.*; | ||
| + | import java.io.*; | ||
| + | |||
| + | class Student | ||
| + | String firstName; | ||
| + | String lastName; | ||
| + | int AEM; | ||
| + | |||
| + | public Student(int AEM, String firstName, String lastName) { | ||
| + | this.firstName = firstName; | ||
| + | this.lastName = lastName; | ||
| + | this.AEM = AEM; | ||
| + | } | ||
| + | |||
| + | public String toString() { | ||
| + | return String.format(" | ||
| + | } | ||
| | | ||
| - | // Create an array | + | // First anonymous comparator class |
| - | | + | static |
| - | private int[] arrayOfInts | + | public |
| - | | + | int cmp = st1.lastName.compareTo(st2.lastName); |
| - | public | + | if(cmp==0) |
| - | // fill the array with ascending integer values | + | cmp = st1.firstName.compareTo(st2.firstName); |
| - | | + | |
| - | | + | cmp = st1.AEM - st2.AEM; |
| + | return cmp; | ||
| } | } | ||
| + | }; | ||
| + | |||
| + | public static void sortLexicographically(List< | ||
| + | Collections.sort(students, | ||
| } | } | ||
| | | ||
| - | | + | |
| + | // 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; | ||
| + | | ||
| + | } | ||
| + | ); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Στη μέθοδο **// | ||
| + | * με τη σειρά που τα διαβάσαμε | ||
| + | * με λεξικογραφική σειρά. | ||
| + | * με βάση το ΑΕΜ | ||
| + | |||
| + | <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> | ||
| + | import java.io.*; | ||
| + | import java.util.*; | ||
| + | |||
| + | public class SortListOfStudents { | ||
| | | ||
| - | public void printEven() { | + | public |
| - | + | | |
| - | | + | |
| - | DataStructureIterator iterator | + | |
| - | | + | |
| - | private int nextIndex = 0; | + | |
| - | + | ||
| - | public boolean hasNext() { | + | |
| - | | + | |
| - | // Check if the current element is the last in the array | + | |
| - | return | + | |
| - | } | + | |
| - | + | ||
| - | public Integer | + | |
| - | + | ||
| - | // Record a value of an even index of the array | + | |
| - | Integer retValue = Integer.valueOf(arrayOfInts[nextIndex]); | + | |
| - | + | ||
| - | // Get the next even element | + | |
| - | nextIndex += 2; | + | |
| - | return retValue; | + | |
| } | } | ||
| - | | ||
| - | public void remove() { } | ||
| - | | ||
| - | }; | ||
| - | while (iterator.hasNext()) { | ||
| - | System.out.print(iterator.next() + " "); | ||
| } | } | ||
| - | System.out.println(); | + | |
| + | | ||
| + | } | ||
| + | catch(InputMismatchException ex) { | ||
| + | System.out.println(" | ||
| + | ex.printStackTrace(); | ||
| + | System.exit(-1); | ||
| + | } | ||
| } | } | ||
| | | ||
| - | public static void main(String | + | |
| - | | + | StringBuilder str = new StringBuilder(); |
| - | | + | for(Student st : students) |
| + | str.append(st+" | ||
| + | str.append(" | ||
| + | return str.toString(); | ||
| + | } | ||
| + | |||
| + | | ||
| + | | ||
| + | System.out.println(" | ||
| + | return; | ||
| + | } | ||
| + | List< | ||
| + | | ||
| + | System.out.println(" --- Init Ordering ---\n" | ||
| + | System.out.println(toString(students)); | ||
| + | Student.sortLexicographically(students); | ||
| + | System.out.println(" | ||
| + | System.out.println(toString(students)); | ||
| + | Student.sortByAEM(students); | ||
| + | System.out.println(" | ||
| + | System.out.println(toString(students)); | ||
| } | } | ||
| } | } | ||
| </ | </ | ||
| - | Παρατηρήστε ότι η ορίζουμε μία νέα κλάση που υλοποιεί το // | ||
| - | Παρακάτω δίνεται ένα άλλο παράδειγμα, όπου η ανώνυμη κλάση επεκτείνει μία υφιστάμενη κλάση | + | ===== Παράδειγμα |
| - | <code java HelloWorldAnonymousClasses.java> | + | Δείτε το προηγούμενο παράδειγμα παραλλαγμένο ως εξής. Αρχικά φτιάχνουμε την εσωτερική // |
| - | public | + | |
| - | + | <code java Student.java> | |
| - | | + | import java.util.Comparator; |
| - | public | + | import java.util.*; |
| - | public | + | import java.io.*; |
| + | |||
| + | class Student | ||
| + | | ||
| + | | ||
| + | int AEM; | ||
| + | |||
| + | | ||
| + | this.firstName = firstName; | ||
| + | | ||
| + | this.AEM = AEM; | ||
| + | } | ||
| + | |||
| + | | ||
| + | return | ||
| } | } | ||
| | | ||
| - | | + | |
| + | |||
| + | } | ||
| | | ||
| - | class EnglishGreeting implements HelloWorld | + | Comparator< |
| - | | + | public int compare(Student st1, Student st2) { |
| - | | + | |
| - | | + | |
| - | | + | |
| - | public void greetSomeone(String someone) { | + | |
| - | | + | cmp = st1.AEM - st2.AEM; |
| - | | + | |
| + | } | ||
| + | }; | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | students.add( new Student(sc.nextInt(), sc.next(), sc.next()) | ||
| } | } | ||
| } | } | ||
| + | catch(FileNotFoundException ex) { | ||
| + | System.out.println(" | ||
| + | } | ||
| + | catch(InputMismatchException ex) { | ||
| + | System.out.println(" | ||
| + | ex.printStackTrace(); | ||
| + | System.exit(-1); | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | public void sortLexicographically(List< | ||
| + | Collections.sort(students, | ||
| + | } | ||
| | | ||
| - | HelloWorld englishGreeting = new EnglishGreeting(); | + | public void sortByAEM(List< |
| - | | + | |
| - | HelloWorld frenchGreeting = new HelloWorld() { | + | |
| - | | + | int cmp = cmp = st1.AEM - st2.AEM; |
| - | | + | if(cmp==0) |
| - | | + | cmp = st1.lastName.compareTo(st2.lastName); |
| - | } | + | if(cmp==0) |
| - | public void greetSomeone(String someone) { | + | |
| - | | + | return cmp; |
| - | System.out.println("Salut " + name); | + | } |
| } | } | ||
| - | | + | ); |
| - | + | ||
| - | 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) { | + | public static String toString(List< |
| - | | + | StringBuffer str = new StringBuffer(); |
| - | } | + | for(Student st : students) |
| + | str.append(st+" | ||
| + | str.append(" | ||
| + | return str.toString(); | ||
| + | } | ||
| + | | ||
| + | public static void main(String | ||
| + | if(args.length == 0) { | ||
| + | System.out.println(" | ||
| + | return; | ||
| + | } | ||
| + | List< | ||
| + | readFromFile(students, | ||
| + | System.out.println(" | ||
| + | | ||
| + | students.get(0).sortLexicographically(students); | ||
| + | System.out.println(" | ||
| + | System.out.println(toString(students)); | ||
| + | students.get(0).sortByAEM(students); | ||
| + | System.out.println(" | ||
| + | System.out.println(toString(students)); | ||
| + | } | ||
| + | | ||
| } | } | ||
| </ | </ | ||
| - | |||
| - | <WRAP tip 80% center round> | ||
| - | Παρατηρήστε ότι η μεταβλητή // | ||
| - | </ | ||
| ===== Πρόσβαση στις τοπικές μεταβλητές και στις μεταβλητές της εξωτερικής κλάσης ===== | ===== Πρόσβαση στις τοπικές μεταβλητές και στις μεταβλητές της εξωτερικής κλάσης ===== | ||
| - | Σε αναλογία με τις [[java: | + | Σε αναλογία με τις [[java: |
| * Η ανώνυμη κλάση έχει πρόσβαση στις μεταβλητές της εξωτερικής κλάσης. | * Η ανώνυμη κλάση έχει πρόσβαση στις μεταβλητές της εξωτερικής κλάσης. | ||
| - | * Η ανώνυμη κλάση δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές της μεθόδου στην οποία ορίζονται αν αυτές δεν έχουν δηλωθεί ως //final//. | + | * Η ανώνυμη κλάση δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές της μεθόδου στην οποία ορίζεται αν αυτές δεν έχουν δηλωθεί ως //final//. |
| * Όπως σε όλες τις μη στατικές εμφωλευμένες κλάσεις ο ορισμός του ίδιου τύπου δεδομένων στην εσωτερική και την εξωτερική κλάση "// | * Όπως σε όλες τις μη στατικές εμφωλευμένες κλάσεις ο ορισμός του ίδιου τύπου δεδομένων στην εσωτερική και την εξωτερική κλάση "// | ||
| - | * Δεν μπορείτε να ορίσετε στατικές μεταβλητές ή μεθόδους μέσα σε μία ανώνυμη κλάση. | + | * __Δεν μπορείτε__ να ορίσετε στατικές μεταβλητές ή μεθόδους μέσα σε μία ανώνυμη κλάση. |
| Σε μία ανώνυμη κλάση μπορείτε να ορίσετε τα εξής: | Σε μία ανώνυμη κλάση μπορείτε να ορίσετε τα εξής: | ||
| * Πεδία | * Πεδία | ||
| - | * Επιπλέον μεθόδους που δεν ορίζονται στη interface ή στην κλάση που επεκτείνει. | + | * Επιπλέον μεθόδους που δεν ορίζονται στο interface ή στην κλάση που επεκτείνεται. |
| - | * Μεθόδους ή block αρχικοποίησης πεδίων της κλάσης. | + | |
| * Τοπικές κλάσεις που ανήκουν στη ανώνυμη κλάση. | * Τοπικές κλάσεις που ανήκουν στη ανώνυμη κλάση. | ||
| * **ΔΕΝ** μπορείτε και __δεν έχει νόημα__ να ορίσετε κατασκευαστές μέσα σε μία ανώνυμη κλάση. | * **ΔΕΝ** μπορείτε και __δεν έχει νόημα__ να ορίσετε κατασκευαστές μέσα σε μία ανώνυμη κλάση. | ||
| + | |||
| + | | Προηγούμενο : [[ : | ||