Sobes.tech
Middle

Какви са разликите между вложените (nested) и вътрешните (inner) класове в Java?

sobes.tech AI

Отговор от AI

  • Вложени класове (Nested classes): Статични членове на външния клас. Нямат директен достъп до нестатичните членове (поля и методи) на външния клас, само чрез екземпляр на външния клас. Обявяват се с ключовата дума static.

  • Вътрешни класове (Inner classes): Нестатични членове на външния клас. Имат пълен достъп до всички членове (статични и нестатични) на външния клас, включително частните. За създаване на екземпляр на вътрешен клас е необходим екземпляр на външния клас. Не използват ключовата дума static.

Пример:

// Външен клас
class Outer {
    private int outerField = 10;
    private static int staticOuterField = 20;

    // Статичен вложен клас
    static class StaticNestedClass {
        void display() {
            // Достъп само до статичните членове на външния клас
            System.out.println("Статичен вложен: " + staticOuterField);
            // Няма директен достъп до outerField
            // System.out.println(outerField); // Грешка при компилация
        }
    }

    // Нестатичен вътрешен клас
    class InnerClass {
        void display() {
            // Достъп до всички членове на външния клас
            System.out.println("Вътрешен: " + outerField);
            System.out.println("Вътрешен (статичен): " + staticOuterField);
        }
    }
}

// Използване
public class Main {
    public static void main(String[] args) {
        // Създаване на екземпляр на статичния вложен клас
        Outer.StaticNestedClass staticNested = new Outer.StaticNestedClass();
        staticNested.display();

        // Създаване на екземпляр на вътрешния клас изисква екземпляр на външния клас
        Outer outer = new Outer();
        Outer.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}
Характеристика Вложен клас (Nested Class) Вътрешен клас (Inner Class)
Ключова дума static Не
Достъп до членове на външния клас Само статични Всички
Изисква екземпляр на външния клас за създаване Не Да
Връзка с екземпляра на външния клас Не Да