Sobes.tech
Middle

Какви видове вложени класове съществуват?

sobes.tech AI

Отговор от AI

Статични вложени класове и вътрешни класове (нестатични вложени класове).

  • Статични вложени класове:

    • Обявяват се с ключовата дума static.
    • Имат достъп само до статичните членове (поля и методи) на външния клас, включително частните.
    • Нямат директен достъп до нестатичните членове на външния клас.
    • Могат да бъдат създадени без инстанция на външния клас.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        static class StaticNested {
            void display() {
                System.out.println("Статична променлива: " + staticVar);
                // System.out.println("Инстанционна променлива: " + instanceVar); // Грешка при компилация
            }
        }
    }
    
  • Вътрешни класове (нестатични вложени класове):

    • Обявяват се без ключовата дума static.
    • Имат пълен достъп до всички членове (статични и нестатични) на външния клас, включително частните.
    • Не могат да съдържат статични членове (поля или методи), освен финални константи.
    • Изискват създаване на екземпляр на външния клас за тяхното създаване.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        class Inner {
            void display() {
                System.out.println("Статична променлива: " + staticVar);
                System.out.println("Инстанционна променлива: " + instanceVar);
            }
        }
    }
    
  • Локални класове:

    • Обявяват се вътре в методи, конструктори или инициализационни блокове.
    • Имат достъп до всички финални и ефективно финални локални променливи, както и до членовете на външния клас, в който са дефинирани.
    • Областта им на видимост е ограничена до блока, в който са обявени.
    class Outer {
        void myMethod() {
            final int localVar = 5; // Ефективно финална
    
            class LocalInner {
                void display() {
                    System.out.println("Локална променлива: " + localVar);
                }
            }
    
            LocalInner local = new LocalInner();
            local.display();
        }
    }
    
  • Анонимни класове:

    • Без име.
    • Създават се и се инстанцират едновременно.
    • Често се използват за създаване на реализации на интерфейси или разширения на класове.
    interface MyInterface {
        void doSomething();
    }
    
    class Outer {
        void myMethod() {
            MyInterface anon = new MyInterface() {
                @Override
                public void doSomething() {
                    System.out.println("Прави нещо анонимно.");
                }
            };
            anon.doSomething();
        }
    }
    

Основните разлики между статичните вложени класове и вътрешните класове:

Характеристика Статичен вложен клас Вътрешен клас
Ключова дума static Няма
Достъп до членове Само до статичните членове на външния клас Всички членове на външния клас
Създаване на екземпляр Без екземпляр на външния клас Изисква се екземпляр на външния клас