2009-06-24 9 views

答えて

2

短い答え:はい

私はJava Language Specificationの正確なセクションを見つけることができませんでした。助けてください。 :)

+0

お願いします。規則が適用されない場合、どんなダッジがありますか? –

+3

もう一つの短い答え:いいえ –

+0

@ Joao:Java静的修飾語では、正確に "コンパイル時"を意味します。メソッド/変数は、クラス名で静的にバインドされます。例外なく。 – dfa

4

はい、ただし、実行時に静的メソッドが削除された場合は、ベースクラスの一致メソッドが呼び出されます(名前と署名はコンパイル時の元のメソッドと完全に一致している必要があり、メソッドは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 { 
} 

はエラーをスローします。

+2

「実行時に削除されました」?どういう意味ですか? –

+0

私が推測しているのは、クラスがSub.x()を呼び出すようにコンパイルされている場合、x()メソッドはSubから削除されますが、実行時に呼び出し元クラスは再コンパイルされません。それが存在します。 – erickson

+0

+1おそらくこれはこの質問への正しいアプローチです – dfa

8

いくつかの引用符:正確な方法であることを:

「コンパイラは、正確な方法は、各静的メソッド呼び出しのために呼ばれ、それはコンパイル時に決定したクラス(つまり、非静的メソッドには大きな違いだが呼び出すことをコンパイルするとき呼び出されるのは実行時にこれらのケースでのみ決定される)。

"静的メソッドの呼び出しは、呼び出されるコンパイル時の型に依存します。

+0

質問の正解ですが、実行時に決定された非静的メソッドについての引用は間違っています。オーバーライドされたメソッドだけが実行時に決定され、他のメソッドはオーバーライドを含むコンパイル時に決定されます。 – Robin

+0

@ロビン:引用符は私のものではありませんが、良い点です:) –

+0

リンクが死んでいるようです –

関連する問題