Jaké druhy vnořených tříd existují v programovacím jazyce?
sobes.tech AI
Odpověď od AI
Vnořené třídy v Javě:
-
Statické vnořené třídy (Static Nested Classes): Chovají se jako běžní statičtí členové třídy. Nemají přístup k nestatickým členům vnější třídy. Jsou vytvářeny bez instance vnější třídy.
public class Outer { private static String staticMsg = "Statická zpráva"; private String instanceMsg = "Zpráva instance"; static class StaticNested { void displayStatic() { // Přístup ke statickým členům vnější třídy System.out.println(staticMsg); // Přístup k nestatickým členům vnější třídy není možný // System.out.println(instanceMsg); // Kompilační chyba } } } -
Vnořené třídy (Inner Classes): Jsou spojeny s instancí vnější třídy. Mají plný přístup ke všem (static i nestatickým) členům vnější třídy, včetně soukromých. Mohou být deklarovány jako
private,protected,package-privatenebopublic.public class Outer { private static String staticMsg = "Statická zpráva"; private String instanceMsg = "Zpráva instance"; class Inner { void display() { // Přístup ke statickým a nestatickým členům System.out.println(staticMsg); System.out.println(instanceMsg); } } } -
Lokální třídy (Local Classes): Jsou deklarovány uvnitř bloku (metody, konstruktoru nebo statického inicializátoru). Jsou dostupné pouze uvnitř tohoto bloku. Mohou odkazovat na
finalnebo efektivněfinallokální proměnné a parametry, stejně jako na všechny členy vnější třídy.public class Outer { private String instanceMsg = "Zpráva instance"; void methodWithLocalClass() { final String localVar = "Lokální proměnná"; // nebo efektivně final class Local { void display() { System.out.println(instanceMsg); System.out.println(localVar); } } Local localObj = new Local(); localObj.display(); } } -
Anonymní třídy (Anonymous Classes): Jsou to třídy bez jména. Používají se k deklaraci a současnému vytvoření instance třídy, která buď implementuje rozhraní, nebo rozšiřuje třídu. Jsou vhodné pro malé, jednorázové objekty.
public class Outer { void methodWithAnonymousClass() { // Anonymní třída implementující rozhraní Runnable Runnable myRunnable = new Runnable() { @Override public void run() { System.out.println("Běží z anonymní třídy"); } }; new Thread(myRunnable).start(); // Anonymní třída rozšiřující třídu Thread Thread myThread = new Thread() { @Override public void run() { System.out.println("Běží z anonymní třídy rozšiřující Thread"); } }; myThread.start(); } }
Porovnání typů vnořených tříd:
| Typ třídy | Místo deklarace | Přístup ke členům vnější třídy | Je potřeba instance vnější třídy pro vytvoření | Modifikátory přístupu |
|---|---|---|---|---|
| Statická vnořená třída | Uvnitř třídy, s klíčovým slovem static. |
Pouze k statickým. | Ne | Všechy |
| Vnořená třída (Inner) | Uvnitř třídy (ne-statik). | Ke všem (statickým i nestatickým) členům. | Ano | Všechy |
| Lokální třída | Uvnitř bloku (metody, konstruktory, inicializátory). | Ke všem členům vnější třídy + final nebo efektivně final lokálním proměnným a parametrům. |
Ano | Ne (final nebo abstract implicitně) |
| Není pojmenovaná třída | Uvnitř bloku (výraz). | Ke všem členům vnější třídy + final nebo efektivně final lokálním proměnným a parametrům. |
Ano | Ne |