Sobes.tech
Middle

Koje vrste ugnježdenih klasa postoje?

sobes.tech АИ

Одговор од АИ

Ugnježdene klase (Nested Classes) u Javi se dele na dva osnovna tipa:

  1. Statičke ugnježdene klase (Static Nested Classes)

    • Obeležene su modifikatorom static.
    • Ponašaju se kao obični statički članovi klase-omotača.
    • Mogu pristupati statičkim članovima spoljne klase (čak i ako su privatni).
    • Nemaju direktan pristup nestatičkim članovima spoljne klase.
    • Kreiraju se bez instance spoljne klase: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
  2. Unutrašnje klase (Inner Classes)

    Unutrašnje klase nisu označene static i povezane su sa instancom spoljne klase. One se dele na:

    • Član- klase (Member Inner Classes)

      • Deklariraju se na nivou člana klase-omotača, ali van njenih metoda.
      • Imaju pristup svim članovima spoljne klase, uključujući privatne.
      • Za njihovo kreiranje je potrebna instanca spoljne klase: OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
    • Lokalne klase (Local Classes)

      • Kreiraju se unutar metoda, konstruktora ili inicijalizacionih blokova.
      • Opseg njihove vidljivosti je ograničen na blok u kojem su deklarisane.
      • Ne mogu biti deklarisane sa pristupnim modifikatorima (public, private, protected).
      • Mogu pristupati final ili efektivno final lokalnim promenljivima spoljnog bloka.
      • Ne mogu se koristiti van bloka u kojem su definisane.
    • Anonimne klase (Anonymous Classes)

      • U suštini, to su lokalne klase bez imena.
      • Deklarišu se i instanciraju istovremeno.
      • Koriste se za implementaciju apstraktne klase ili interfejsa "na licu mesta".
      • Kao i lokalne klase, imaju pristup final ili efektivno final lokalnim promenljivima spoljnog bloka.

    Primer strukture:

class OuterClass {
    private int outerField;
    private static int staticOuterField;

    // Statička ugnježdena klasa
    static class StaticNestedClass {
        void accessOuter() {
            // Može pristupati statičkim članovima spoljne klase
            int value = staticOuterField;
            // Ne može pristupati nestatičkim članovima spoljne klase
            // int value2 = outerField; // Greška pri kompajliranju
        }
    }

    // Član- klasa (Unutrašnja klasa)
    class MemberInnerClass {
        void accessOuter() {
            // Može pristupati svim članovima spoljne klase
            int value1 = outerField;
            int value2 = staticOuterField;
        }
    }

    void methodWithLocalAndAnonymous() {
        final int localVar = 10; // efektivno final

        // Lokalna klasa
        class LocalClass {
            void accessOuter() {
                // Može pristupati članovima spoljne klase i lokalnim final/efektivno final promenljivima
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
            }
        }

        LocalClass localObj = new LocalClass();
        localObj.accessOuter();

        // Anonimna klasa (koja implementira interfejs Runnable)
        Runnable anonymousRunnable = new Runnable() {
            @Override
            public void run() {
                // Može pristupati članovima spoljne klase i lokalnim final/efektivno final promenljivima
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
                System.out.println("Running with local variable: " + localValue);
            }
        };

        anonymousRunnable.run();
    }
}