Внутренние классы Java
Внутренние классы Java
В Java также возможно вложение классов (класс внутри класса). Назначение вложенных классов — группировать классы, которые принадлежат друг другу, что делает ваш код более читабельным и удобным для сопровождения.
Чтобы получить доступ к внутреннему классу, создайте объект внешнего класса, а затем создайте объект внутреннего класса:
Пример
class OuterClass {
int x = 10;
class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
// Outputs 15 (5 + 10)
Частный внутренний класс
В отличие от «обычного» класса, внутренний класс может быть private
или protected
. Если вы не хотите, чтобы внешние объекты обращались к внутреннему классу, объявите класс как private
:
Пример
class OuterClass {
int x = 10;
private class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
Если вы попытаетесь получить доступ к частному внутреннему классу из внешнего класса, произойдет ошибка:
Main.java:13: error: OuterClass.InnerClass has private access in OuterClass
OuterClass.InnerClass myInner = myOuter.new InnerClass();
^
Статический внутренний класс
Внутренний класс также может быть static
, что означает, что вы можете получить к нему доступ, не создавая объект внешнего класса:
Пример
class OuterClass {
int x = 10;
static class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass.InnerClass myInner = new OuterClass.InnerClass();
System.out.println(myInner.y);
}
}
// Outputs 5
Примечание: как и static
атрибуты и методы, static
внутренний класс не имеет доступа к членам внешнего класса.
Доступ к внешнему классу из внутреннего класса
Одним из преимуществ внутренних классов является то, что они могут обращаться к атрибутам и методам внешнего класса:
Пример
class OuterClass {
int x = 10;
class InnerClass {
public int myInnerMethod() {
return x;
}
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.myInnerMethod());
}
}
// Outputs 10