Почему у нас могут быть статические заключительные участники, но наклон имеет статический метод в не статическом внутреннем классе?
Действительно ли мы можем получить доступ к статическим заключительным членским переменным внутреннего класса вне внешнего класса, не инстанцируя внутреннего класса?
ВЫ МОЖЕТЕ иметь статический метод в статическом «внутреннем» классе.
public class Outer {
static String world() {
return "world!";
}
static class Inner {
static String helloWorld() {
return "Hello " + Outer.world();
}
}
public static void main(String args[]) {
System.out.println(Outer.Inner.helloWorld());
// prints "Hello world!"
}
}
Однако, чтобы быть точным, Внутренний
называется вложенным классом в соответствии с терминологией JLS ( 8.1.3 ):
Внутренние классы могут наследовать статические члены, которые не компилируются. -временные константы, даже если они не могут их объявлять. Вложенные классы, которые не являются внутренними классами, могут свободно объявлять статические члены в соответствии с обычными правилами языка программирования Java.
Кроме того, НЕ в точности то, что внутренний класс может иметь static final
членов; чтобы быть более точным, они также должны быть константами времени компиляции . Следующий пример иллюстрирует разницу:
public class InnerStaticFinal {
class InnerWithConstant {
static final int n = 0;
// OKAY! Compile-time constant!
}
class InnerWithNotConstant {
static final Integer n = 0;
// DOESN'T COMPILE! Not a constant!
}
}
Причина, по которой в этом контексте разрешены константы времени компиляции, очевидна: они встроены во время компиляции.