Внутренние классы Java
В этой главе мы изучим внутренние классы Java.
В Java один класс может содержать другой класс. Синтаксис выглядит так:
class OuterClass { // 外部类
// ...
class NestedClass { // 嵌套类,或称为内部类
// ...
}
}
Чтобы получить доступ к внутреннему классу, можно создать объект внешнего класса, а затем создать объект внутреннего класса.
Существует два типа вложенных классов:
- Нестатический внутренний класс
- Статический внутренний класс
Нестатический внутренний класс
Нестатический внутренний класс — это класс, вложенный в другой класс. Он имеет доступ к членам внешнего класса и часто называется внутренним классом.
Поскольку внутренний класс вложен во внешний класс, сначала нужно создать экземпляр внешнего класса, а затем создать объект внутреннего класса.
Пример
int x = 10;
class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
Вывод приведенного выше примера:
15
Приватный внутренний класс
Внутренние классы можно модифицировать с помощью private или protected. Если вы не хотите, чтобы к внутреннему классу можно было получить доступ извне внешнего класса, вы можете использовать модификатор private:
Пример
int x = 10;
private class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
В приведённом выше примере InnerClass объявлен как приватный внутренний класс, и при его выполнении будет выдана ошибка:
MyMainClass.java:12: error: OuterClass.InnerClass has private access in OuterClass
OuterClass.InnerClass myInner = myOuter.new InnerClass();
^
Статический внутренний класс
Статические внутренние классы можно определять с помощью ключевого слова static. Для статических внутренних классов нам не нужно создавать внешний класс, чтобы получить к ним доступ; мы можем обращаться к ним напрямую:
Пример
int x = 10;
static class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass.InnerClass myInner = new OuterClass.InnerClass();
System.out.println(myInner.y);
}
}
Вывод приведенного выше примера:
5
Примечание:Статические внутренние классы не могут обращаться к членам внешнего класса.
Доступ к членам внешнего класса из внутреннего класса
Продвинутое применение внутренних классов состоит в том, что они могут получать доступ к свойствам и методам внешнего класса:
Пример
int x = 10;
class InnerClass {
public int myInnerMethod() {
return x;
}
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.myInnerMethod());
}
}
Вывод приведенного выше примера:
10Другие расширения
Объекты и классы Java