← Назад к вопросам
Как создать экземпляр внутреннего класса?
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. Сравнение типов
| Тип | Синтаксис | Требует внешнего | Использование |
|---|---|---|---|
| Обычный inner | outer.new Inner() | Да | Связанный класс |
| Статический | new Outer.Inner() | Нет | Вспомогательный |
| Локальный | new Local() | Да | В методе |
| Анонимный | new Interface(){} | Нет | Одноразовая |
10. Лучшие практики
- Статический класс при отсутствии контекста — эффективнее по памяти
- Lambda вместо анонимных — в Java 8+ более читаемо
- Избегайте излишней вложенности — максимум 2 уровня
- Документируйте связь классов — явно отмечайте зависимости
- Локальные для операций в методе — используйте редко
Таким образом, создание экземпляра зависит от типа: обычные требуют экземпляра внешнего класса, статические — нет.