ВЫ МОЖЕТЕ иметь статический метод в статическом"внутреннем" классе.
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!"
}
}
Однако, если быть точным, Inner
называется вложенным классом в соответствии с терминологией 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!
}
}
Причина, по которой константы времени компиляции допускаются в этом контексте, очевидна: они встроены во время компиляции.