Есть ли что-то под названием Local Static Inner Class?
Я просто экспериментировал с внутренними классами и натолкнулся на идею иметь локальный, но статический внутренний класс... ну, я сделал внутренний класс внутри статического метода... ну, это просто так... Вот пример, который я сделал
class Outer {
static void m() {
class LocalStatic {
void s() {
System.out.println("static local inner class method");
}
}
}
}
class Demo {
public static void main(String args[]) {
Outer.m();
}
}
Это не дает никакой ошибки компиляции.
Я знаю, как получить доступ к статическому методу m. Но я хочу знать, есть ли способ получить доступ к локальному классу LocalStatic из внешнего класса. Ну, насколько я понимаю, мы не можем получить доступ к чему-то внутри метода, верно? Следовательно, я не могу получить доступ ни к LocalStatic, ни к каким-либо методам или атрибутам внутри этого локального класса извне класса Outer. Просто хотел убедиться...
4 ответа
Я хочу знать, есть ли способ получить доступ к локальному классу LocalStatic из внешнего класса
Нет способа сделать это. Локальные классы, ну, в общем, локальные, поэтому единственный способ получить к ним доступ - это метод, в котором класс находится в области действия*.
Вы можете получить доступ к объектам локального класса, используя нелокальный базовый класс или интерфейс:
interface SomeInterface {
void s();
}
class Outer {
static SomeInterface m() {
class LocalStatic implements SomeInterface {
public void s() {
System.out.println("static local inner class method");
}
}
return new LocalStatic();
}
}
Теперь вы можете написать
SomeInterface i = Outer.m();
i.s();
Demo.
* Само собой разумеется, что есть также способ получить доступ к этим классам через рефлексию, но это вне возможностей самого языка Java.
"Следовательно, я не могу получить доступ ни к LocalStatic, ни к каким-либо методам или атрибутам внутри этого локального класса извне класса Outer. Просто хотел убедиться..." Область действия даже меньше, чем Outer
класс - вы можете получить доступ LocalStatic
класс только в m()
метод.
Ответ на вопрос в вашем заголовке заключается в том, что вы можете объявить локальный внутренний класс в статическом контексте (статический метод или статический инициализатор), но тогда у него не будет включающего экземпляра класса. Так что есть смысл называть это
Локальный статический внутренний класс
или, может быть
Локальный статический вложенный класс
Я никогда не видел, чтобы кто-то так их называл или использовал.
Вы можете объявить класс внутри любого метода, конструктора или инициализатора. Такой класс называется локальным классом. Является ли метод статичным или нет, не имеет значения. Невозможно ссылаться на такой класс из какой-либо части кода, кроме метода, конструктора или инициализатора, в котором он объявлен.
Местные классы почти никогда не используются. Я знал людей, которые годами были профессиональными программистами Java, которые не знали, что классы могут быть объявлены внутри методов.