Внутренние классы в Java: дизайн, синтаксис и практические примеры
В Java класс может быть объявлен внутри другого класса. Внешний класс называется outer class, внутренний — nested class (вложенный).
Типы вложенных классов
- Non-static nested classes (внутренние классы) — нестатические члены внешнего класса.
- Static nested classes — статические члены внешнего класса.
Внутренние классы (Inner Classes)
Внутренний класс может быть private, что обеспечивает инкапсуляцию. Он имеет доступ ко всем членам внешнего класса, включая private.
Обычный внутренний класс
class Outer_Demo {
int num;
private class Inner_Demo {
public void print() {
System.out.println("This is an inner class");
}
}
void display_Inner() {
Inner_Demo inner = new Inner_Demo();
inner.print();
}
}
public class My_class {
public static void main(String args[]) {
Outer_Demo outer = new Outer_Demo();
outer.display_Inner();
}
}
Результат: This is an inner class.
Доступ к private членам внешнего класса
class Outer_Demo {
private int num = 175;
public class Inner_Demo {
public int getNum() {
System.out.println("This is the getnum method of the inner class");
return num;
}
}
}
public class My_class2 {
public static void main(String args[]) {
Outer_Demo outer = new Outer_Demo();
Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();
System.out.println(inner.getNum());
}
}
Результат: This is the getnum method of the inner class: 175
Локальный внутренний класс (Method-local Inner Class)
Объявляется внутри метода. Область видимости ограничена методом. Может обращаться к final/эффективно final локальным переменным метода.
public class Outerclass {
void my_Method() {
int num = 23;
class MethodInner_Demo {
public void print() {
System.out.println("This is method inner class " + num);
}
}
MethodInner_Demo inner = new MethodInner_Demo();
inner.print();
}
public static void main(String args[]) {
new Outerclass().my_Method();
}
}
Результат: This is method inner class 23
Анонимный внутренний класс (Anonymous Inner Class)
Класс без имени, объявляется и инстанцируется одновременно. Используется для переопределения методов класса или интерфейса.
abstract class AnonymousInner {
public abstract void mymethod();
}
public class Outer_class {
public static void main(String args[]) {
AnonymousInner inner = new AnonymousInner() {
public void mymethod() {
System.out.println("This is an example of anonymous inner class");
}
};
inner.mymethod();
}
}
Результат: This is an example of anonymous inner class
Анонимный класс как аргумент метода
interface Message {
String greet();
}
public class My_class {
public void displayMessage(Message m) {
System.out.println(m.greet() + ", This is an example of anonymous inner class as an argument");
}
public static void main(String args[]) {
My_class obj = new My_class();
obj.displayMessage(new Message() {
public String greet() { return "Hello"; }
});
}
}
Результат: Hello, This is an example of anonymous inner class as an argument
Статический вложенный класс (Static Nested Class)
Объявляется с модификатором static. Не требует экземпляра внешнего класса. Не имеет доступа к нестатическим членам внешнего класса.
public class Outer {
static class Nested_Demo {
public void my_method() {
System.out.println("This is my nested class");
}
}
public static void main(String args[]) {
Outer.Nested_Demo nested = new Outer.Nested_Demo();
nested.my_method();
}
}
Результат: This is my nested class
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Вложенные и внутренние классы в Java: типы, примеры и лучшие практики
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление