Javaの静的メソッドは常にコンパイル時に解決されますか?
3 に答える
はい、Sun のフォーラムのこのスレッドで徹底的に調査および説明されています: New To Java - No late binding for static methods
いくつかの引用:
コンパイラがそのクラスをコンパイルするとき、コンパイル時に各静的メソッド呼び出しに対してどの正確なメソッドが呼び出されるかを決定します (これが非静的メソッド呼び出しとの大きな違いです: 呼び出される正確なメソッドは、これらの場合にのみ実行時に決定されます)。
静的メソッドの呼び出しは、それが呼び出されるコンパイル時の型にのみ依存します。
はい。ただし、静的メソッドが実行時に削除された場合は、基本クラスの一致するメソッドが呼び出されます (名前とシグネチャはコンパイル時の元のメソッドと正確に一致する必要があり、メソッドは JVM 仕様規則によってアクセス可能である必要があります)。
明確にするために、コードの呼び出しを検討してください。
Derived.fn();
そして、次の呼び出しコード:
class Base {
public static void fn() {
System.err.println("Base");
}
}
class Derived extends Base {
public static void fn() {
System.err.println("Derived");
}
}
印刷しDerived
ます。
今、私はすべてをコンパイルします。次に、Derived を次のように変更して再コンパイルします。
class Derived extends Base {
}
印刷しBase
ます。
おそらく、Derived を次のように変更して再コンパイルします。
class Derived {
}
エラーをスローします。
短い答え:はい
Java 言語仕様の正確なセクションを見つけることができませんでした。助けてください。:)