Javaの静的メソッドは、コンパイル時に常に解決されますか?Javaの静的メソッドは、コンパイル時に常に解決されますか?
答えて
短い答え:はい
私はJava Language Specificationの正確なセクションを見つけることができませんでした。助けてください。 :)
はい、ただし、実行時に静的メソッドが削除された場合は、ベースクラスの一致メソッドが呼び出されます(名前と署名はコンパイル時の元のメソッドと完全に一致している必要があり、メソッドは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
が表示されます。おそらく、その後、私はちょうど派生再コンパイル
に変更:
class Derived {
}
はエラーをスローします。
いくつかの引用符:正確な方法であることを:
「コンパイラは、正確な方法は、各静的メソッド呼び出しのために呼ばれ、それはコンパイル時に決定したクラス(つまり、非静的メソッドには大きな違いだが呼び出すことをコンパイルするとき呼び出されるのは実行時にこれらのケースでのみ決定される)。
"静的メソッドの呼び出しは、呼び出されるコンパイル時の型に依存します。
質問の正解ですが、実行時に決定された非静的メソッドについての引用は間違っています。オーバーライドされたメソッドだけが実行時に決定され、他のメソッドはオーバーライドを含むコンパイル時に決定されます。 – Robin
@ロビン:引用符は私のものではありませんが、良い点です:) –
リンクが死んでいるようです –
お願いします。規則が適用されない場合、どんなダッジがありますか? –
もう一つの短い答え:いいえ –
@ Joao:Java静的修飾語では、正確に "コンパイル時"を意味します。メソッド/変数は、クラス名で静的にバインドされます。例外なく。 – dfa