Ce tipuri de clase în interior în limbajul de programare există?
sobes.tech AI
Răspuns de la AI
Clase înnălțată în Java:
-
Clase înnălțate statice (Static Nested Classes): Se comportă ca membrii statici obișnuiți ai clasei. Nu au acces la membrii non-statice ai clasei exterioare. Sunt create fără o instanță a clasei exterioare.
public class Outer { private static String staticMsg = "Mesaj static"; private String instanceMsg = "Mesaj de instanță"; static class StaticNested { void displayStatic() { // Acces la membrii statici ai clasei exterioare System.out.println(staticMsg); // Fără acces la membrii non-statice ai clasei exterioare // System.out.println(instanceMsg); // Eroare de compilare } } } -
Clase interne (Inner Classes): Sunt legate de o instanță a clasei exterioare. Au acces complet la toți membrii (static și non-static) ai clasei exterioare, inclusiv cei privați. Pot fi declarate
private,protected,package-privatesaupublic.public class Outer { private static String staticMsg = "Mesaj static"; private String instanceMsg = "Mesaj de instanță"; class Inner { void display() { // Acces la membrii statici și non-statice ai clasei exterioare System.out.println(staticMsg); System.out.println(instanceMsg); } } } -
Clase locale (Local Classes): Sunt declarate în interiorul unui bloc (metodă, constructor sau inițializator static). Sunt disponibile doar în interiorul acestui bloc. Pot face referire la variabile locale
finalsau efectivfinalși parametrii blocului, precum și la toți membrii clasei exterioare.public class Outer { private String instanceMsg = "Mesaj de instanță"; void methodWithLocalClass() { final String localVar = "Variabilă locală"; // sau efectiv final class Local { void display() { System.out.println(instanceMsg); System.out.println(localVar); } } Local localObj = new Local(); localObj.display(); } } -
Clase anonime (Anonymous Classes): Sunt clase locale fără nume. Sunt utilizate pentru declararea și crearea simultană a unei instanțe a unei clase care implementează o interfață sau extinde o clasă. Sunt utile pentru crearea de obiecte mici, utilizate o singură dată.
public class Outer { void methodWithAnonymousClass() { // Clasă anonimă care implementează interfața Runnable Runnable myRunnable = new Runnable() { @Override public void run() { System.out.println("Running from anonymous class"); } }; new Thread(myRunnable).start(); // Clasă anonimă care extinde clasa Thread Thread myThread = new Thread() { @Override public void run() { System.out.println("Running from anonymous class extending Thread"); } }; myThread.start(); } }
Compararea tipurilor de clase înnălțate:
| Tipul clasei | Locul declarației | Acces la membrii clasei exterioare | Este nevoie de o instanță a clasei exterioare pentru creare | Modificatori de acces |
|---|---|---|---|---|
| Clasă înnălțată static | În interiorul clasei, cu cuvântul cheie static. |
Doar la membrii statici. | Nu | Toți |
| Clasă internă (Inner) | În interiorul clasei (non-static). | La toți membrii (statici și non-statici). | Da | Toți |
| Clasă locală | În interiorul unui bloc (metode, constructori, inițializatori). | La toți membrii ai clasei exterioare + variabile și parametri locali final sau efectiv final. |
Da | Nu (final sau abstract implicit) |
| Clasă anonimă | În interiorul unui bloc (expresie). | La toți membrii ai clasei exterioare + variabile și parametri locali final sau efectiv final. |
Da | Nu |