Sobes.tech
Middle

Welke soorten geneste klassen zijn er in programmeertalen?

sobes.tech AI

Antwoord van AI

Geneste klasse in Java:

  1. Statische geneste klassen (Static Nested Classes): Gedragen zich als gewone statische leden van de klasse. Hebben geen toegang tot niet-statische leden van de externe klasse. Worden gemaakt zonder instantie van de externe klasse.

    public class Outer {
        private static String staticMsg = "Static message";
        private String instanceMsg = "Instance message";
    
        static class StaticNested {
            void displayStatic() {
                // Toegang tot statische leden van de externe klasse
                System.out.println(staticMsg);
                // Geen toegang tot niet-statische leden van de externe klasse
                // System.out.println(instanceMsg); // Compileerfout
            }
        }
    }
    
  2. Binnenklassen (Inner Classes): Gelieerd aan een instantie van de externe klasse. Hebben volledige toegang tot alle (static en non-static) leden van de externe klasse, inclusief privé. Kunnen worden gedeclareerd als private, protected, package-private of public.

    public class Outer {
        private static String staticMsg = "Static message";
        private String instanceMsg = "Instance message";
    
        class Inner {
            void display() {
                // Toegang tot statische en niet-statische leden van de externe klasse
                System.out.println(staticMsg);
                System.out.println(instanceMsg);
            }
        }
    }
    
  3. Lokale klassen (Local Classes): Worden gedeclareerd binnen een blok (methode, constructor of statische initialisator). Alleen beschikbaar binnen dat blok. Kunnen verwijzen naar final of effectief final lokale variabelen en parameters van het blok, evenals alle leden van de externe klasse.

    public class Outer {
        private String instanceMsg = "Instance message";
    
        void methodWithLocalClass() {
            final String localVar = "Local variable"; // of effectief final
    
            class Local {
                void display() {
                    System.out.println(instanceMsg);
                    System.out.println(localVar);
                }
            }
    
            Local localObj = new Local();
            localObj.display();
        }
    }
    
  4. Anonieme klassen (Anonymous Classes): Zijn lokale klassen zonder naam. Worden gebruikt voor het gelijktijdig declareren en maken van een instantie van een klasse die ofwel een interface implementeert of een klasse uitbreidt. Handig voor het maken van kleine, eenmalige objecten.

    public class Outer {
        void methodWithAnonymousClass() {
            // Anonieme klasse die interface Runnable implementeert
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Running from anonymous class");
                }
            };
            new Thread(myRunnable).start();
    
            // Anonieme klasse die klasse Thread uitbreidt
            Thread myThread = new Thread() {
                @Override
                public void run() {
                    System.out.println("Running from anonymous class extending Thread");
                }
            };
            myThread.start();
        }
    }
    

Vergelijking van de verschillende soorten geneste klassen:

Klasse type Plaats van declaratie Toegang tot leden van de externe klasse Is een instantie van de externe klasse nodig voor creatie Toegangsmodificatoren
Statische geneste klasse Binnen de klasse, met het sleutelwoord static. Alleen tot statische leden. Nee Alle
Binnenklasse (Inner) Binnen de klasse (niet-statisch). Tot alle (statische en niet-statische) leden. Ja Alle
Lokale klasse Binnen een blok (methoden, constructors, initialisatoren). Tot alle leden van de externe klasse + final of effectief final lokale variabelen en parameters. Ja Nee (final of abstract impliciet)
Anonieme klasse Binnen een blok (uitdrukking). Tot alle leden van de externe klasse + final of effectief final lokale variabelen en parameters. Ja Nee