Sobes.tech
Junior

Šta su ugnježdene klase?

sobes.tech АИ

Одговор од АИ

Ugnježdene klase (nested classes) su klase koje su deklarisane unutar druge klase. Mogu biti statičke (static nested classes) ili nestatike (inner classes).

Statičke ugnježdene klase:

  • Deklarišu se sa modifikatorom static.
  • Nemaju direktan pristup nestatickim članovima spoljašnje klase (samo putem instance spoljašnje klase).
  • Mogu sadržavati i statičke i nestatike članove.
  • Kreiraju se bez instance spoljašnje klase.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public static class StaticNested {
        // Ima pristup staticOuterVar
        public void printStaticValue() {
            System.out.println(staticOuterVar);
        }

        // Nema direktan pristup instanceOuterVar
        // public void printInstanceValue() {
        //     System.out.println(instanceOuterVar); // Greška pri kompilaciji
        // }
    }
}

Upotreba statičke ugnježdene klase:

// Primer kreiranja instance statičke ugnježdene klase
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.printStaticValue(); // Ispisaće 10

Nestatike unutrašnje klase (Inner Classes):

  • Deklarišu se bez modifikatora static.
  • Imaju pun pristup svim članovima spoljašnje klase, uključujući privatne.
  • Ne mogu sadržavati statičke članove (osim konstanti vremena kompajliranja).
  • Za njihovo kreiranje je potrebna instanca spoljašnje klase.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public class Inner {
        // Ima pristup staticOuterVar i instanceOuterVar
        public void printValues() {
            System.out.println(staticOuterVar); // Dostupno
            System.out.println(instanceOuterVar); // Dostupno
        }
    }
}

Kreiranje instance nestatike unutrašnje klase:

// Kreiranje instance nestatike unutrašnje klase
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
innerObject.printValues(); // Ispisaće 10 i 20

Prednosti korišćenja ugniježdenih klasa:

  1. Logička grupacija: Klase koje se koriste samo od strane druge klase mogu biti logički grupisane unutar nje.
  2. Enkapsulacija: Ugnježdene klase imaju pristup privatnim članovima spoljašnje klase.
  3. Čitljivost i održavanje: Kod postaje organizovaniji.

Tipovi nestatike ugniježdenih klasa:

  • Lokalne klase: Deklarišu se unutar metode.
  • Anonimne klase: Klase bez imena, obično se koriste za kreiranje instance apstraktne klase, interfejsa ili osnovne klase sa prepisanim metodama.

Lokalna klasa:

public class Outer {
    public void myMethod() {
        class LocalClass {
            void display() {
                System.out.println("Unutar lokalne klase");
            }
        }
        LocalClass local = new LocalClass();
        local.display();
    }
}

Anonimna klasa (primer sa interfejsom):

interface Greeting {
    void sayHello();
}

public class Outer {
    public void greet() {
        Greeting anonymousGreeting = new Greeting() {
            @Override
            public void sayHello() {
                System.out.println("Zdravo iz anonimne klase!");
            }
        };
        anonymousGreeting.sayHello();
    }
}