Middle
რა ტიპის შიდა კლასები არსებობს?
sobes.tech AI
პასუხი AI-სგან
Java-ში ნესტიან კლასებს (Nested Classes) ძირითადად ორი ძირითადი ტიპი აქვს:
-
სტატიკური ნესტიანი კლასები (Static Nested Classes)
- აღნიშნულია
staticმორფმინით. - მოქმედებს როგორც ჩვეულებრივი სტატიკური წევრები კლასის კონტეინერის.
- შეუძლია წვდომა გარეგანი კლასის სტატიკურ წევრებზე (მიუხედავად მათი პირადობისა).
- პირდაპირი წვდომა არ აქვს გარეგანი კლასის არა-სტატიკურ წევრებზე.
- შექმნილია გარეგანი კლასის ინстанციის გარეშე:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
- აღნიშნულია
-
შიგნით კლასები (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();
}
}