Sobes.tech
Middle

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:

  1. 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
            }
        }
    }
    
  2. 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-private sau public.

    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);
            }
        }
    }
    
  3. 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 final sau efectiv final ș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();
        }
    }
    
  4. 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