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 Няма
Достъп до членове Само до статичните членове на външната класа Всички членове на външната класа
Създаване на екземпляр Без екземпляр на външната класа Изисква се екземпляр на външната класа