Sobes.tech
Middle

Millised on siseklasside tüübid?

sobes.tech AI

Vastus AI-lt

Java-sises klases (Nested Classes) galvenokārt ir sadalītas divos galvenajos tipos:

  1. Statiskās iekšējās klases (Static Nested Classes)

    • atzīmētas ar static modifikatoru.
    • uzvedas kā parasti statiski klases locekļi.
    • var piekļūt ārējās klases statiskajiem locekļiem (pat ja tie ir privāti).
    • tieši nevar piekļūt ārējās klases nestatiskajiem locekļiem.
    • tiek izveidotas bez ārējās klases eksemplāra: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
  2. Iekšējās klases (Inner Classes)

    Iekšējās klases nav atzīmētas ar static un ir saistītas ar ārējās klases eksemplāru. Tās skaitās:

    • Členklases (Member Inner Classes)

      • deklarētas kā ārējās klases locekļi, bet ārpus tās metožu robežām.
      • piekļūst visiem ārējās klases locekļiem, ieskaitot privātos.
      • prasa ārējās klases eksemplāru: OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
    • Vietējās klases (Local Classes)

      • tiek izveidotas metožu, konstruktoru vai inicializācijas bloku iekšienē.
      • to redzamība ir ierobežota ar to bloku.
      • nevar deklarēt ar piekļuves modifikatoriem (public, private, protected).
      • var piekļūt final vai efektīvi final vietējiem mainīgajiem ārējā bloka ietvaros.
      • nevar izmantot ārpus tā bloka, kur tas ir deklarēts.
    • Anonīmās klases (Anonymous Classes)

      • būtībā, tās ir bezvārda vietējās klases.
      • deklarē un instancē vienlaikus.
      • tiek izmantotas, lai īstenotu abstraktisku klasi vai interfeisu "uz vietas".
      • tāpat kā vietējās klases, tām ir piekļuve final vai efektīvi final vietējiem mainīgajiem ārējā bloka ietvaros.

    Struktūras piemērs:

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

    // Statiskā iekšējā klase
    static class StaticNestedClass {
        void accessOuter() {
            // Var piekļūt ārējās klases statiskajiem locekļiem
            int value = staticOuterField;
            // Nevar piekļūt nestatiskajiem locekļiem
            // int value2 = outerField; // Kompiliācijas kļūda
        }
    }

    // Nario-klass (Iekšējā klase)
    class MemberInnerClass {
        void accessOuter() {
            // Var piekļūt visiem locekļiem
            int value1 = outerField;
            int value2 = staticOuterField;
        }
    }

    void methodWithLocalAndAnonymous() {
        final int localVar = 10; // efektīvi final

        // Vietējā klase
        class LocalClass {
            void accessOuter() {
                // Var piekļūt ārējās klases locekļiem un vietējiem final/efektīvi final mainīgajiem
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
            }
        }

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

        // Anonīma klase (īsteno Runnable interfeisu)
        Runnable anonymousRunnable = new Runnable() {
            @Override
            public void run() {
                // Var piekļūt ārējās klases locekļiem un vietējiem final/efektīvi final mainīgajiem
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
                System.out.println("Running with local variable: " + localValue);
            }
        };

        anonymousRunnable.run();
    }
}