Sobes.tech
Middle

Ի՞նչ տեսակների ներքին դասեր կան:

sobes.tech AI

Պատասխան AI-ից

Java-յում ներքին դասերը (Nested Classes) հիմնականում երկու տեսակ են՝

  1. Ստատիկ ներքին դասեր (Static Nested Classes)

    • նշված են static մոդիֆիկատորով։
    • վարքագիծ ունեն որպես սովորական ստատիկ անդամներ։
    • կարող են մուտք ունենալ արտաքին դասի ստատիկ անդամներին (նույնիսկ եթե դրանք մասնավոր են)։
    • չունեն մուտք դեպի արտաքին դասի ոչ-ստատիկ անդամներ ուղղակիորեն։
    • ստեղծվում են առանց արտաքին դասի օրինակ ունենալու՝ OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();։
  2. Ներքին դասեր (Inner Classes)

    Ներքին դասերը նշված չեն static մոդիֆիկատորով և կապված են արտաքին դասի օրինակին։ Դրանք բաժանվում են՝

    • Անդամ-դասեր (Member Inner Classes)

      • հայտարարում են որպես արտաքին դասի անդամ, բայց դուրս նրա մեթոդներից։
      • ունեն մուտք բոլոր անդամներին արտաքին դասի, ներառյալ մասնավորները։
      • պահանջում են արտաքին դասի օրինակ՝ OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();։
    • Տեղական դասեր (Local Classes)

      • ստեղծվում են մեթոդների, կոնստրուկտորների կամ ինիցիալիզացիայի բլոկների ներսում։
      • սահմանափակ են այն բլոկով, որտեղ հայտարարված են։
      • չեն կարող հայտարարել մոդիֆիկատորներով՝ public, private, protected։
      • կարող են դիմել final կամ արդյունավետ final տեղական փոփոխականներին արտաքին բլոկից։
      • չեն կարող օգտագործվել այն բլոկից դուրս, որտեղ հայտարարված են։
    • Անանուն դասեր (Anonymous Classes)

      • ըստ էության, դա անվան չունեցող տեղական դասեր են։
      • հայտարարում և ինստանցավորում են միաժամանակ։
      • օգտագործվում են որպես աբստրակտ դաս կամ ինտերֆեյս իրականացնել "ուղիղ"։
      • ինչպես տեղական դասերը, ունեն մուտք final կամ արդյունավետ final տեղական փոփոխականներին արտաքին բլոկից։

    Օրինակային կառուցվածք՝

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

    // Ստատիկ ներքին դաս
    static class StaticNestedClass {
        void accessOuter() {
            // Կարող է դիմել արտաքին դասի ստատիկ անդամներին
            int value = staticOuterField;
            // Չի կարող դիմել արտաքին դասի ոչ-ստատիկ անդամներին
            // int value2 = outerField; // Կոմպիլյատորային սխալ
        }
    }

    // Անդամ-դաս (Ներքին դաս)
    class MemberInnerClass {
        void accessOuter() {
            // Կարող է դիմել բոլոր անդամներին արտաքին դասի
            int value1 = outerField;
            int value2 = staticOuterField;
        }
    }

    void methodWithLocalAndAnonymous() {
        final int localVar = 10; // արդյունավետ final

        // Տեղական դաս
        class LocalClass {
            void accessOuter() {
                // Կարող է դիմել արտաքին դասի անդամներին և տեղական final/effectively final փոփոխականներին
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
            }
        }

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

        // Անանուն դաս (իրականացնում է Runnable ինտերֆեյսը)
        Runnable anonymousRunnable = new Runnable() {
            @Override
            public void run() {
                // Կարող է դիմել արտաքին դասի անդամներին և տեղական final/effectively final փոփոխականներին
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
                System.out.println("Running with local variable: " + localValue);
            }
        };

        anonymousRunnable.run();
    }
}