Sobes.tech
Middle

Welche Arten von verschachtelten Klassen gibt es in der Programmiersprache?

sobes.tech KI

Antwort von AI

Verschachtelte Klassen in Java:

  1. Statische verschachtelte Klassen (Static Nested Classes): Verhalten sich wie normale statische Mitglieder der Klasse. Haben keinen Zugriff auf nicht-statische Mitglieder der äußeren Klasse. Werden ohne Instanz der äußeren Klasse erstellt.

    public class Outer {
        private static String staticMsg = "Statische Nachricht";
        private String instanceMsg = "Instanznachricht";
    
        static class StaticNested {
            void displayStatic() {
                // Zugriff auf statische Mitglieder der äußeren Klasse
                System.out.println(staticMsg);
                // Kein Zugriff auf nicht-statische Mitglieder der äußeren Klasse
                // System.out.println(instanceMsg); // Kompilierungsfehler
            }
        }
    }
    
  2. Innere Klassen (Inner Classes): Sind mit einer Instanz der äußeren Klasse verbunden. Haben vollen Zugriff auf alle (statischen und nicht-statischen) Mitglieder der äußeren Klasse, inklusive private. Können private, protected, package-private oder public deklariert werden.

    public class Outer {
        private static String staticMsg = "Statische Nachricht";
        private String instanceMsg = "Instanznachricht";
    
        class Inner {
            void display() {
                // Zugriff auf statische und nicht-statische Mitglieder der äußeren Klasse
                System.out.println(staticMsg);
                System.out.println(instanceMsg);
            }
        }
    }
    
  3. Lokale Klassen (Local Classes): Werden innerhalb eines Blocks (Methode, Konstruktor oder statischer Initialisierer) deklariert. Sind nur innerhalb dieses Blocks verfügbar. Können auf lokale Variablen und Parameter des Blocks zugreifen, die final oder effektiv final sind, sowie auf alle Mitglieder der äußeren Klasse.

    public class Outer {
        private String instanceMsg = "Instanznachricht";
    
        void methodWithLocalClass() {
            final String localVar = "Lokale Variable"; // oder effektiv final
    
            class Local {
                void display() {
                    System.out.println(instanceMsg);
                    System.out.println(localVar);
                }
            }
    
            Local localObj = new Local();
            localObj.display();
        }
    }
    
  4. Anonyme Klassen (Anonymous Classes): Sind lokale Klassen ohne Namen. Werden verwendet, um gleichzeitig eine Klasse zu deklarieren und eine Instanz zu erstellen, die eine Schnittstelle implementiert oder eine Klasse erweitert. Sind nützlich für kleine, einmalige Objekte.

    public class Outer {
        void methodWithAnonymousClass() {
            // Anonyme Klasse, die die Schnittstelle Runnable implementiert
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Ausführung durch anonyme Klasse");
                }
            };
            new Thread(myRunnable).start();
    
            // Anonyme Klasse, die die Klasse Thread erweitert
            Thread myThread = new Thread() {
                @Override
                public void run() {
                    System.out.println("Ausführung durch anonyme Klasse, die Thread erweitert");
                }
            };
            myThread.start();
        }
    }
    

Vergleich der verschachtelten Klassen:

Klassetyp Deklarationsort Zugriff auf die Mitglieder der äußeren Klasse Für die Erstellung erforderlich? Zugriffsmodifikatoren
Statische verschachtelte Klasse Innerhalb der Klasse, mit dem Schlüsselwort static. Nur auf statische. Nein Alle
Innere Klasse Innerhalb der Klasse (nicht statisch). Auf alle (statische und nicht-statische). Ja Alle
Lokale Klasse Innerhalb eines Blocks (Methoden, Konstruktoren, Initialisierer). Auf alle Mitglieder der äußeren Klasse + final oder effektiv final lokale Variablen. Ja Nein (final oder abstract implizit)
Anonyme Klasse Innerhalb eines Blocks (Ausdruck). Auf alle Mitglieder der äußeren Klasse + final oder effektiv final lokale Variablen. Ja Nein