Sobes.tech
Middle

Ποιοι τύποι εσωτερικών κλάσεων υπάρχουν;

sobes.tech AI

Απάντηση από AI

Στατικοί εσωτερικοί κλάσεις και εσωτερικές κλάσεις (μη στατικές εσωτερικές κλάσεις).

  • Στατικές εσωτερικές κλάσεις:

    • Δηλώνονται με τη λέξη-κλειδί static.
    • Έχουν πρόσβαση μόνο σε στατικά μέλη (πεδία και μεθόδους) της εξωτερικής κλάσης, συμπεριλαμβανομένων των ιδιωτικών.
    • Δεν έχουν άμεση πρόσβαση σε μη στατικά μέλη της εξωτερικής κλάσης.
    • Μπορούν να δημιουργηθούν χωρίς ένα στιγμιότυπο της εξωτερικής κλάσης.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        static class StaticNested {
            void display() {
                System.out.println("Στατική μεταβλητή: " + staticVar);
                // System.out.println("Μεταβλητή στιγμιότυπου: " + instanceVar); // Σφάλμα μεταγλώττισης
            }
        }
    }
    
  • Εσωτερικές κλάσεις (μη στατικές εσωτερικές κλάσεις):

    • Δηλώνονται χωρίς τη λέξη-κλειδί static.
    • Έχουν πλήρη πρόσβαση σε όλα τα μέλη (στατικά και μη στατικά) της εξωτερικής κλάσης, συμπεριλαμβανομένων των ιδιωτικών.
    • Δεν μπορούν να περιέχουν στατικά μέλη (πεδία ή μεθόδους), εκτός από τελικές σταθερές.
    • Απαιτούν την ύπαρξη ενός στιγμιότυπου της εξωτερικής κλάσης για τη δημιουργία τους.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        class Inner {
            void display() {
                System.out.println("Στατική μεταβλητή: " + staticVar);
                System.out.println("Μεταβλητή στιγμιότυπου: " + instanceVar);
            }
        }
    }
    
  • Τοπικές κλάσεις:

    • Δηλώνονται μέσα σε μεθόδους, κατασκευαστές ή μπλοκ αρχικοποίησης.
    • Έχουν πρόσβαση σε όλες τις τελικές και ουσιαστικά τελικές τοπικές μεταβλητές, καθώς και στα μέλη της εξωτερικής κλάσης στην οποία ορίζονται.
    • Η περιοχή ορατότητάς τους περιορίζεται στο μπλοκ όπου δηλώνονται.
    class Outer {
        void myMethod() {
            final int localVar = 5; // Effectively final
    
            class LocalInner {
                void display() {
                    System.out.println("Τοπική μεταβλητή: " + localVar);
                }
            }
    
            LocalInner local = new LocalInner();
            local.display();
        }
    }
    
  • Ανώνυμες κλάσεις:

    • Χωρίς όνομα τοπικές κλάσεις.
    • Δημιουργούνται και δημιουργούνται ταυτόχρονα.
    • Συχνά χρησιμοποιούνται για τη δημιουργία υλοποιήσεων διεπαφών ή επέκτασης κλάσεων.
    interface MyInterface {
        void doSomething();
    }
    
    class Outer {
        void myMethod() {
            MyInterface anon = new MyInterface() {
                @Override
                public void doSomething() {
                    System.out.println("Κάνοντας κάτι ανώνυμα.");
                }
            };
            anon.doSomething();
        }
    }
    

Οι βασικές διαφορές μεταξύ στατικών εσωτερικών κλάσεων και εσωτερικών κλάσεων:

Χαρακτηριστικό Στατική εσωτερική κλάση Εσωτερική κλάση
Λέξη-κλειδί static Δεν υπάρχει
Πρόσβαση σε μέλη Μόνο στατικά μέλη της εξωτερικής Όλα τα μέλη της εξωτερικής κλάσης
Δημιουργία στιγμιότυπου Χωρίς στιγμιότυπο της εξωτερικής κλάσης Απαιτείται στιγμιότυπο της εξωτερικής κλάσης
Στατικά μέλη Μπορούν να περιέχουν Δεν μπορούν (εκτός από σταθερές)