Sobes.tech
Middle

Ce tipuri de clase imbricate există?

sobes.tech AI

Răspuns de la AI

Clase statice înglobate și clase interne (clase înglobate nesatice).

  • Clase statice înglobate:

    • Declarate cu cuvântul cheie static.
    • Au acces doar la membrii statici (câmpuri și metode) ai clasei externe, inclusiv private.
    • Nu au acces direct la membrii nesatice ai clasei externe.
    • Pot fi instantiate fără o instanță a clasei externe.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        static class StaticNested {
            void display() {
                System.out.println("Variabilă statică: " + staticVar);
                // System.out.println("Variabilă de instanță: " + instanceVar); // Eroare de compilare
            }
        }
    }
    
  • Clase interne (clase interne nesatice):

    • Declarate fără cuvântul cheie static.
    • Au acces complet la toate membrii (statice și nesatice) ai clasei externe, inclusiv private.
    • Nu pot conține membri statici (câmpuri sau metode), cu excepția constantelor finale.
    • Necesită o instanță a clasei externe pentru a fi create.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        class Inner {
            void display() {
                System.out.println("Variabilă statică: " + staticVar);
                System.out.println("Variabilă de instanță: " + instanceVar);
            }
        }
    }
    
  • Clase locale:

    • Declarate în interiorul metodelor, constructorilor sau blocurilor de inițializare.
    • Au acces la toate variabilele locale finale și efectiv finale, precum și la membrii clasei externe în care sunt definite.
    • Domeniul lor de vizibilitate este limitat la blocul în care sunt declarate.
    class Outer {
        void myMethod() {
            final int localVar = 5; // Final efectiv
    
            class LocalInner {
                void display() {
                    System.out.println("Variabilă locală: " + localVar);
                }
            }
    
            LocalInner local = new LocalInner();
            local.display();
        }
    }
    
  • Clase anonime:

    • Clase locale fără nume.
    • Sunt create și instantiate simultan.
    • Sunt adesea folosite pentru a crea implementări ale interfețelor sau pentru a extinde clase.
    interface MyInterface {
        void doSomething();
    }
    
    class Outer {
        void myMethod() {
            MyInterface anon = new MyInterface() {
                @Override
                public void doSomething() {
                    System.out.println("Fac ceva anonim.");
                }
            };
            anon.doSomething();
        }
    }
    

Principalele diferențe între clasele statice înglobate și clasele interne:

Caracteristică Clasă internă statică Clasă internă
Cuvânt cheie static Absent
Acces la membri Doar la membrii statici ai clasei Toți membrii clasei externe
externe
Crearea instanței Fără o instanță a clasei externe Necesită o instanță a clasei externe
Membri statici Pot conține Nu pot conține (cu excepția constantelor)