← Назад к вопросам

Как создать экземпляр внутреннего класса?

2.3 Middle🔥 91 комментариев
#ООП#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как создать экземпляр внутреннего класса?

Внутренние классы — это классы, определённые внутри других классов. Способ создания зависит от типа внутреннего класса.

1. Обычный внутренний класс

Требует экземпляра внешнего класса и имеет доступ к его полям.

public class Outer {
    private String outerField = "Outer data";
    
    public class Inner {
        public void display() {
            System.out.println(outerField);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.display();
    }
}

Синтаксис создания: outerInstance.new InnerClass()

2. Статический внутренний класс

Не имеет доступа к экземплярам внешнего класса.

public class Outer {
    private static String staticField = "Static data";
    
    public static class Inner {
        public void display() {
            System.out.println(staticField);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner();
        inner.display();
    }
}

Синтаксис: new OuterClass.InnerClass()

3. Локальный класс

Определён внутри метода, видим только в методе.

public class Outer {
    public void method() {
        final int localVar = 10;
        
        class Local {
            public void display() {
                System.out.println("Value: " + localVar);
            }
        }
        
        Local local = new Local();
        local.display();
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.method();
    }
}

4. Анонимный класс

Класс без имени, используется для реализации интерфейсов.

public interface Drawable {
    void draw();
}

public class Main {
    public static void main(String[] args) {
        Drawable drawable = new Drawable() {
            @Override
            public void draw() {
                System.out.println("Drawing...");
            }
        };
        drawable.draw();
    }
}

5. Практический пример

public class Person {
    private String name;
    private List<Address> addresses = new ArrayList<>();
    
    public static class Address {
        private String city;
        private String street;
        
        public Address(String city, String street) {
            this.city = city;
            this.street = street;
        }
    }
    
    public Person(String name) {
        this.name = name;
    }
    
    public void addAddress(Address address) {
        addresses.add(address);
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John");
        Person.Address addr = new Person.Address("New York", "5th Ave");
        person.addAddress(addr);
    }
}

6. Iterator через внутренний класс

public class CustomList<T> implements Iterable<T> {
    private List<T> items = new ArrayList<>();
    
    public void add(T item) {
        items.add(item);
    }
    
    private class ListIterator implements Iterator<T> {
        private int index = 0;
        
        @Override
        public boolean hasNext() {
            return index < items.size();
        }
        
        @Override
        public T next() {
            return items.get(index++);
        }
    }
    
    @Override
    public Iterator<T> iterator() {
        return new ListIterator();
    }
}

7. Анонимный класс с состоянием

public interface Processor {
    void process(int value);
}

public class Main {
    public static void main(String[] args) {
        Processor processor = new Processor() {
            private int sum = 0;
            
            @Override
            public void process(int value) {
                sum += value;
                System.out.println("Sum: " + sum);
            }
        };
        
        processor.process(10);
        processor.process(20);
    }
}

8. Lambda вместо анонимного класса

public interface Drawable {
    void draw();
}

public class Main {
    public static void main(String[] args) {
        Drawable drawable = () -> System.out.println("Drawing");
        drawable.draw();
    }
}

9. Сравнение типов

ТипСинтаксисТребует внешнегоИспользование
Обычный innerouter.new Inner()ДаСвязанный класс
Статическийnew Outer.Inner()НетВспомогательный
Локальныйnew Local()ДаВ методе
Анонимныйnew Interface(){}НетОдноразовая

10. Лучшие практики

  1. Статический класс при отсутствии контекста — эффективнее по памяти
  2. Lambda вместо анонимных — в Java 8+ более читаемо
  3. Избегайте излишней вложенности — максимум 2 уровня
  4. Документируйте связь классов — явно отмечайте зависимости
  5. Локальные для операций в методе — используйте редко

Таким образом, создание экземпляра зависит от типа: обычные требуют экземпляра внешнего класса, статические — нет.