Sobes.tech
Junior

Τι είναι οι εσωτερικές κλάσεις;

sobes.tech AI

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

Οι εσωτερικές κλάσεις (nested classes) είναι κλάσεις που δηλώνονται μέσα σε μια άλλη κλάση. Μπορούν να είναι στατικές (static nested classes) ή μη στατικές (inner classes).

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

  • Δηλώνονται με τον τροποποιητή static.
  • Δεν έχουν άμεση πρόσβαση στα μη στατικά μέλη της εξωτερικής κλάσης (μόνο μέσω ενός δείκτη της εξωτερικής κλάσης).
  • Μπορούν να περιέχουν τόσο στατικά όσο και μη στατικά μέλη.
  • Δημιουργούνται χωρίς ένα αντικείμενο της εξωτερικής κλάσης.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public static class StaticNested {
        // Έχει πρόσβαση στο staticOuterVar
        public void printStaticValue() {
            System.out.println(staticOuterVar);
        }

        // Δεν έχει άμεση πρόσβαση στο instanceOuterVar
        // public void printInstanceValue() {
        //     System.out.println(instanceOuterVar); // Σφάλμα μεταγλώττισης
        // }
    }
}

Χρήση στατικής εσωτερικής κλάσης:

// Παράδειγμα δημιουργίας αντικειμένου της στατικής εσωτερικής κλάσης
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.printStaticValue(); // Θα εμφανίσει 10

Μη στατικές εσωτερικές κλάσεις (Inner Classes):

  • Δεν δηλώνονται με τον τροποποιητή static.
  • Έχουν πλήρη πρόσβαση σε όλα τα μέλη της εξωτερικής κλάσης, συμπεριλαμβανομένων των ιδιωτικών.
  • Δεν μπορούν να περιέχουν στατικά μέλη (εκτός από σταθερές χρόνου μεταγλώττισης).
  • Απαιτούν τη δημιουργία ενός αντικειμένου της εξωτερικής κλάσης για τη δημιουργία τους.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public class Inner {
        // Έχει πρόσβαση στο staticOuterVar και στο instanceOuterVar
        public void printValues() {
            System.out.println(staticOuterVar); // Διαθέσιμο
            System.out.println(instanceOuterVar); // Διαθέσιμο
        }
    }
}

Χρήση μη στατικής εσωτερικής κλάσης:

// Δημιουργία αντικειμένου της μη στατικής εσωτερικής κλάσης
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
innerObject.printValues(); // Θα εμφανίσει 10 και 20

Πλεονεκτήματα της χρήσης εσωτερικών κλάσεων:

  1. Λογική ομαδοποίηση: Κλάσεις που χρησιμοποιούνται μόνο από μια άλλη κλάση μπορούν να ομαδοποιηθούν λογικά μέσα σε αυτή.
  2. Ενσωμάτωση και απόκρυψη: Οι εσωτερικές κλάσεις έχουν πρόσβαση στα ιδιωτικά μέλη της εξωτερικής κλάσης.
  3. Αναγνωσιμότητα και διαχειρισιμότητα: Ο κώδικας γίνεται πιο οργανωμένος.

Τύποι μη στατικών εσωτερικών κλάσεων:

  • Τοπικές κλάσεις: Δηλώνονται μέσα σε μια μέθοδο.
  • Ανώνυμες κλάσεις: Κλάσεις χωρίς προφανές όνομα, συνήθως χρησιμοποιούνται για τη δημιουργία αντικειμένου μιας αφηρημένης κλάσης, διεπαφής ή βασικής κλάσης με υπερκαλύψεις μεθόδων.

Τοπική κλάση:

public class Outer {
    public void myMethod() {
        class LocalClass {
            void display() {
                System.out.println("Μέσα σε τοπική κλάση");
            }
        }
        LocalClass local = new LocalClass();
        local.display();
    }
}

Ανώνυμη κλάση (παράδειγμα με διεπαφή):

interface Greeting {
    void sayHello();
}

public class Outer {
    public void greet() {
        Greeting anonymousGreeting = new Greeting() {
            @Override
            public void sayHello() {
                System.out.println("Γειά από την ανώνυμη κλάση!");
            }
        };
        anonymousGreeting.sayHello();
    }
}