静的なfinalメンバーを持つことができるのに、非静的な内部クラスに静的メソッドを持つことができないのはなぜですか?
内部クラスをインスタンス化せずに、外部クラスの外部の内部クラスの静的最終メンバー変数にアクセスできますか?
静的なfinalメンバーを持つことができるのに、非静的な内部クラスに静的メソッドを持つことができないのはなぜですか?
内部クラスをインスタンス化せずに、外部クラスの外部の内部クラスの静的最終メンバー変数にアクセスできますか?
静的な「内部」クラスに静的メソッドを含めることができます。
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)Inner
に従ってネストされたクラスと呼ばれます。
内部クラスは、宣言していなくても、コンパイル時定数ではない静的メンバーを継承する場合があります。内部クラスではないネストされたクラスは、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!
}
}
このコンテキストでコンパイル時定数が許可される理由は明らかです。コンパイル時にインライン化されます。