Sobes.tech
Junior

Mis on sisemised klassid?

sobes.tech AI

Vastus AI-lt

Sisemine klass (nested classes) on klassid, mis on deklareeritud teise klassi sees. Need võivad olla staatilised (static nested classes) ja mitte-staatilised (inner classes).

Staatilised sisemised klassid:

  • Deklareeritud static modifikaatoriga.
  • Ei pääse otse ligi välise klassi mitte-staatilistele liikmetele (ainult välise klassi eksemplari kaudu).
  • Võivad sisaldada nii staatilisi kui mitte-staatilisi liikmeid.
  • Loovad ilma välise klassi eksemplarita.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public static class StaticNested {
        // Ligipääs staticOuterVar
        public void printStaticValue() {
            System.out.println(staticOuterVar);
        }

        // Otse ligipääs instanceOuterVar ei ole võimalik
        // public void printInstanceValue() {
        //     System.out.println(instanceOuterVar); // Kompilatsiooni viga
        // }
    }
}

Staatilise sisemise klassi kasutamine:

// Näide staatilise sisemise klassi eksemplari loomise kohta
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.printStaticValue(); // Väljund 10

Mitte-staatilised sisemised klassid (Inner Classes):

  • Deklareeritud ilma static.
  • Omab täielikku juurdepääsu kõigile välise klassi liikmetele, kaasa arvatud privaatsed.
  • Ei saa sisaldada staatilisi liikmeid (välja arvatud konstantsed, mis on compile-time).
  • Vajab välise klassi eksemplari.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public class Inner {
        // Ligipääs staticOuterVar ja instanceOuterVar
        public void printValues() {
            System.out.println(staticOuterVar); // Saadaval
            System.out.println(instanceOuterVar); // Saadaval
        }
    }
}

Mitte-staatilise sisemise klassi kasutamine:

// Näide mitte-staatilise sisemise klassi eksemplari loomise kohta
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
innerObject.printValues(); // Väljund 10 ja 20

Sisemiste klasside eelised:

  1. Loogiline grupimine: Klassid, mida kasutatakse ainult ühe teise klassi sees, saab loogiliselt grupeerida.
  2. Inkapulatsioon: Sisemised klassid pääsevad ligi privaatselt välise klassi liikmetele.
  3. Lugemise ja hoolduse lihtsustamine: Kood muutub organiseeritumaks.

Mitte-staatiliste sisemiste klasside tüübid:

  • Lokaalsed klassid: Deklareeritud meetodi sees.
  • Anonüümklassid: Klassi ilma nimega, tavaliselt kasutatakse abstraktsete klasside, liideste või alusklasside eksemplaride loomiseks meetodite ülekirjutamisega.

Lokaalne klass:

public class Outer {
    public void myMethod() {
        class LocalClass {
            void display() {
                System.out.println("Lokaalse klassi sees");
            }
        }
        LocalClass local = new LocalClass();
        local.display();
    }
}

Anonüümne klass (liidese näide):

interface Greeting {
    void sayHello();
}

public class Outer {
    public void greet() {
        Greeting anonymousGreeting = new Greeting() {
            @Override
            public void sayHello() {
                System.out.println("Tere anonüümse klassist!");
            }
        };
        anonymousGreeting.sayHello();
    }
}