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