Kokie yra įterptųjų klasių tipai programavimo kalboje?
sobes.tech AI
Atsakymas iš AI
Java vidiniai klasės:
-
Statinės vidinės klasės (Static Nested Classes): Elgiasi kaip įprasti statiniai klasės nariai. Neturi prieigos prie išorinės klasės nestatinių narių. Sukuriamos be išorinės klasės egzemplioriaus.
public class Outer { private static String staticMsg = "Statinė žinutė"; private String instanceMsg = "Egzemplioriaus žinutė"; static class StaticNested { void displayStatic() { // Prieiga prie išorinės klasės statinių narių System.out.println(staticMsg); // Neturi prieigos prie išorinės klasės nestatinių narių // System.out.println(instanceMsg); // Klaidų kompiliacija } } } -
Vidinės klasės (Inner Classes): Susijusios su išorinės klasės egzemplioriumi. Turi pilną prieigą prie visų (static ir non-static) narių, įskaitant privačius. Gali būti deklaruotos kaip
private,protected,package-privatearbapublic.public class Outer { private static String staticMsg = "Statinė žinutė"; private String instanceMsg = "Egzemplioriaus žinutė"; class Inner { void display() { // Prieiga prie statinių ir nestatinių narių System.out.println(staticMsg); System.out.println(instanceMsg); } } } -
Vietinės klasės (Local Classes): Deklaruojamos bloko viduje (metodas, konstruktorius arba statinis inicializatorius). Prieinamos tik šiame bloke. Gali naudoti
finalarba efektyviaifinalvietinius kintamuosius ir parametrus, taip pat visus išorinius narius.public class Outer { private String instanceMsg = "Egzemplioriaus žinutė"; void methodWithLocalClass() { final String localVar = "Vietinis kintamasis"; // arba efektyviai final class Local { void display() { System.out.println(instanceMsg); System.out.println(localVar); } } Local localObj = new Local(); localObj.display(); } } -
Anoniminės klasės (Anonymous Classes): Bevardės vietinės klasės. Naudojamos vienu metu deklaruoti ir kurti klasės egzempliorių, kuris arba įgyvendina sąsają, arba išplečia klasę. Patogios mažų, vienkartinių objektų kūrimui.
public class Outer { void methodWithAnonymousClass() { // Runnable sąsają įgyvendinanti anoniminė klasė Runnable myRunnable = new Runnable() { @Override public void run() { System.out.println("Vykdoma iš anoniminės klasės"); } }; new Thread(myRunnable).start(); // Thread klasės išplėtimas anonimine klase Thread myThread = new Thread() { @Override public void run() { System.out.println("Vykdoma iš anoniminės klasės, išplečiančios Thread"); } }; myThread.start(); } }
Palyginimas tarp vidinių klasių tipų:
| Tipas | Deklaracijos vieta | Prieiga prie išorinės klasės narių | Reikia išorinės klasės egzemplioriaus kurti | Modifikatoriai |
|---|---|---|---|---|
| Statinė vidinė klasė | Klasės viduje, su static |
Tik prie statinių | Ne | Visi |
| Vidinė klasė (Inner) | Klasės viduje (ne statinė) | Visų (statinių ir nestatinių) | Taip | Visi |
| Vietinė klasė | Bloko viduje (metodas, konstruktorius, inicializatorius) | Visų išorinių narių + final arba efektyviai final vietinių kintamųjų |
Taip | Ne |