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();
    }
}