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
Πλεονεκτήματα της χρήσης εσωτερικών κλάσεων:
- Λογική ομαδοποίηση: Κλάσεις που χρησιμοποιούνται μόνο από μια άλλη κλάση μπορούν να ομαδοποιηθούν λογικά μέσα σε αυτή.
- Ενσωμάτωση και απόκρυψη: Οι εσωτερικές κλάσεις έχουν πρόσβαση στα ιδιωτικά μέλη της εξωτερικής κλάσης.
- Αναγνωσιμότητα και διαχειρισιμότητα: Ο κώδικας γίνεται πιο οργανωμένος.
Τύποι μη στατικών εσωτερικών κλάσεων:
- Τοπικές κλάσεις: Δηλώνονται μέσα σε μια μέθοδο.
- Ανώνυμες κλάσεις: Κλάσεις χωρίς προφανές όνομα, συνήθως χρησιμοποιούνται για τη δημιουργία αντικειμένου μιας αφηρημένης κλάσης, διεπαφής ή βασικής κλάσης με υπερκαλύψεις μεθόδων.
Τοπική κλάση:
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();
}
}