同じ名前のメソッドが 2 つある場合、メソッドを で呼び出すと、最初のメソッドが受け入れSomeObject
、2 番目のメソッドが拡張オブジェクトを受け入れると、のみを受け入れるメソッドが自動的に使用されることに気付きました。にキャストすると、オブジェクトが instanceof であっても、受け入れるメソッドが使用されます。これは、コンパイル時にメソッドが選択されることを意味します。なんで?SomeObject
SomeOtherObject
SomeObject
SomeOtherObject
SomeObject
SomeObject
SomeOtherObject
3 に答える
これが、Java でのメソッドのオーバーロード解決のしくみです。メソッドはコンパイル時に選択されます。
詳細については、Java 言語仕様 §15.12 を参照してください。
これは、コンパイル時にメソッドが選択されることを意味します。
はい。それで合っています。それが意味することです。
なんで?
彼らが Java をこのように設計した理由は 4 つ考えられます。
これは、オーバーロードをサポートする他の静的に型付けされた OO 言語の動作と一致しています。これは、C++ の世界に出入りした人々が期待するものです。(これは、Java の初期の頃は特に重要でしたが、現在はそれほど重要ではありません。) C# はオーバーロードを同じ方法で処理することに注意してください。
効率的です。(実際の引数の型に基づいて) 実行時にメソッドのオーバーロードを解決すると、オーバーロードされたメソッドの呼び出しが高価になります。
これにより、より予測可能な (したがって、より理解しやすい) 動作が得られます。
基本クラスに新しいオーバーロードされたメソッドを追加すると、既存の派生クラスで予期しない問題が発生するという脆弱な基本クラスの問題が回避されます。
参考文献:
はい、実行する関数はコンパイル時に決定されます! そのため、JVM はコンパイル時にオブジェクトの実際の型を認識していません。関数の引数として指定されたオブジェクトを指す参照の型のみを認識します。
詳細については、Choosing the Most Specific Method in Java Specification を参照してください。