Sobes.tech
Junior

Какви са вложените класове?

sobes.tech AI

Отговор от AI

Вложените класове (nested classes) са класове, обявени вътре в друг клас. Те могат да бъдат статични (static nested classes) или нестатични (inner classes).

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

  • Обявяват се с модификатора static.
  • Не имат директен достъп до нестатичните членове на външния клас (само чрез екземпляр на външния клас).
  • Могат да съдържат както статични, така и нестатични членове.
  • Създават се без екземпляр на външния клас.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public static class StaticNested {
        // Има достъп до staticOuterVar
        public void printStaticValue() {
            System.out.println(staticOuterVar);
        }

        // Няма директен достъп до instanceOuterVar
        // public void printInstanceValue() {
        //     System.out.println(instanceOuterVar); // Грешка при компилация
        // }
    }
}

Използване на статичен вложен клас:

// Пример за създаване на екземпляр на статичен вложен клас
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.printStaticValue(); // Ще изведе 10

Нестатични вложени класове (Inner Classes):

  • Обявяват се без модификатора static.
  • Имат пълен достъп до всички членове на външния клас, включително частните.
  • Не могат да съдържат статични членове (освен константи по време на компилация).
  • За създаването им е необходим екземпляр на външния клас.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public class Inner {
        // Има достъп до staticOuterVar и instanceOuterVar
        public void printValues() {
            System.out.println(staticOuterVar); // Достъпно
            System.out.println(instanceOuterVar); // Достъпно
        }
    }
}

Създаване на екземпляр на нестатичен вътрешен клас:

// Създаване на екземпляр на нестатичен вътрешен клас
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
innerObject.printValues(); // Ще изведе 10 и 20

Предимства на използването на вложени класове:

  1. Логическа групиране: Класове, които се използват само от друг клас, могат да бъдат логически групирани вътре в него.
  2. Инкапсулация: Вложените класове имат достъп до частните членове на външния клас.
  3. Четливост и поддръжка: Кодът става по-организиран.

Типове нестатични вложени класове:

  • Локални класове: Обявяват се вътре в метод.
  • Анонимни класове: Класове без явно име, обикновено се използват за създаване на екземпляр на абстрактен клас, интерфейс или базов клас с преопределени методи.

Локален клас:

public class Outer {
    public void myMethod() {
        class LocalClass {
            void display() {
                System.out.println("Вътре в локалния клас");
            }
        }
        LocalClass local = new LocalClass();
        local.display();
    }
}

Анонимен клас (пример с интерфейс):

interface Greeting {
    void sayHello();
}

public class Outer {
    public void greet() {
        Greeting anonymousGreeting = new Greeting() {
            @Override
            public void sayHello() {
                System.out.println("Здравей от анонимния клас!");
            }
        };
        anonymousGreeting.sayHello();
    }
}