Middle
Խոսեք ներքին դասարանների մասին և երբ են կիրառվում։
sobes.tech AI
Պատասխան AI-ից
Java-յի Նեստինգ դասերը (Nested Classes) այն դասերն են, որոնք սահմանված են մյուս դասի ներսում։ Դրանք բաժանվում են երկու տեսակի՝ ստատիկ (Static Nested Classes) և ներքին դասեր (Inner Classes):
Ստատիկ նեստինգ դասեր
- Դրանք հայտարարում են
staticմոդիֆիկատորով: - ունեն միայն արտաքին դասի ստատիկ անդամների հասանելիություն (նույնիսկ թաքնված)
- չունեն հասանելիություն արտաքին դասի ոչ-ստատիկ անդամներին
- ստատիկ նեստինգ դասի օրինակ ստեղծելու համար անհրաժեշտ չէ արտաքին դասի օրինակ:
// Արտաքին դաս class Outer { static int outerStaticField; int outerInstanceField; // Ստատիկ նեստինգ դաս static class StaticNested { void accessOuter() { // Ասած արտաքին դասի ստատիկ դաշտին System.out.println(Outer.outerStaticField); // Չի կարող հասանելի լինել outerInstanceField-ին // System.out.println(outerInstanceField); // Կոմպիլյատորային սխալ } } } // Ստատիկ նեստինգ դասի օգտագործում class Main { public static void main(String[] args) { Outer.StaticNested nestedObject = new Outer.StaticNested(); nestedObject.accessOuter(); } }
Ներքին դասեր
- Դրանք հայտարարում են առանց
staticմոդիֆիկատորի - ունեն լիարժեք հասանելիություն արտաքին դասի բոլոր անդամներին (ստատիկ և ոչ-ստատիկ, նույնիսկ թաքնված)
- ներքին դասի օրինակ գոյություն չունի առանց արտաքին դասի օրինակ
- արտաքին դասի օրինակով կարելի է ստեղծել ներքին դասի օրինակ՝
// Արտաքին դաս class Outer { static int outerStaticField; int outerInstanceField; // Ներքին դաս class Inner { void accessOuter() { // Ասած արտաքին դասի ստատիկ դաշտին System.out.println(Outer.outerStaticField); // Ասած արտաքին դասի ոչ-ստատիկ դաշտին System.out.println(outerInstanceField); } } } // Ներքին դասի օգտագործում class Main { public static void main(String[] args) { Outer outerObject = new Outer(); Outer.Inner innerObject = outerObject.new Inner(); innerObject.accessOuter(); } }
Ներքին դասերը բաժանվում են՝
- Նորմալ ներքին դասեր: Դրանք սահմանված են արտաքին դասի մարմնում
- Տեղական ներքին դասեր: Դրանք սահմանված են մեթոդների, կոնստրուկտորների կամ ինիցիալիզացիոն բլոկների ներսում և տեսանելի են միայն այդ բլոկի սահմաններում
class Outer { void display() { class LocalInner { // Տեղական ներքին դաս void message() { System.out.println("Տեղական ներքին դաս"); } } LocalInner obj = new LocalInner(); obj.message(); } } - Անանուն ներքին դասեր: Դրանք անվան չունեցող դասեր, որոնք օգտագործվում են օրինակ ստեղծելու կամ ինտերֆեյսի իրականացման համար և անմիջապես տրամադրում են իրենց իրականացմանը։ Սովորաբար օգտագործվում են իրադարձությունների լսիչների (event listeners) հետ:
interface Greeting { void sayHello(); } class Main { public static void main(String[] args) { Greeting greeting = new Greeting() { // Անանուն ներքին դաս @Override public void sayHello() { System.out.println("Բարև!"); } }; greeting.sayHello(); } }
Երբ կիրառվում են նեստինգ դասեր:
- ** տրամաբանական խմբավորումներ:** Եթե դասը միայն արտաքին դասի մաս է և ունի իմաստ խմբավորելու նրանց միասին։ Սա բարելավում է կոդի ընթեռնելիությունը և սպասարկումը
- Ապակասեցում: Ներքին դասերը կարող են մուտք ունենալ արտաքին դասի անդամներին, ինչը ապահովում է ավելի սերտ կապ և հնարավոր է թաքցնել իրականացման մանրամասները
- Կոդի ավելի լավ ընթեռնելիություն: Երբ փոքր, պարզ դասը օգտագործվում է միայն մեկ տեղում, նրա ներգրավումը կարող է դարձնել կոդը ավելի մաքուր
- Ռեսուրսների արդյունավետ օգտագործում: Ներքին դասերը ունեն մուտք արտաքին դասի անդամներին առանց նրանց հստակ փոխանցման, ինչը կարող է պարզեցնել կոդը։ Օրինակ՝ ինտերատորների իրականացման ժամանակ
- Ինտերֆեյսների իրականացման կամ դասերի ընդլայնման համար: Անանուն ներքին դասերը հաճախ օգտագործվում են ինտերֆեյսների կամ աբստրակտ դասերի կոմպակտ իրականացման համար "լայն"։
- Իմիտացիայի թաքցում: Դասի թաքցնում արտաքին դասի ներսում՝ դարձնելով այն անհայտ դուրսից:
Ստատիկ նեստինգ և ներքին դասերի համեմատություն:
| Պարամետր | Ստատիկ նեստինգ դաս | Ներքին դաս |
|---|---|---|
Մոդիֆիկատ static |
Այո | Ոչ |
| Հասանելիություն արտաքին դասի անդամներին | Միայն ստատիկ (նույնիսկ private) | Բոլոր անդամներ (ստատիկ և ոչ-ստատիկ, private) |
| Արտաքին դասի օրինակով ստեղծելու անհրաժեշտություն | Ոչ | Այո |
| Կապ արտաքին դասի օրինակին | Ոչ | Այո |
Ընտրությունը՝ ստատիկ նեստինգ դաս կամ ներքին դաս, կախված է նրանից՝ արդյոք նեստինգ դասը պետք է հասանելի լինի ոչ-ստատիկ անդամներին։ Եթե պետք է, օգտագործեք ներքին դասը։ Եթե ոչ, ստատիկ նեստինգ դասը ավելի հարմար է, քանի որ այն կապված չէ արտաքին դասի օրինակին և կարող է լինել ավելի արդյունավետ։