私のアプリの構造は次のようになります。
class Father{
a(){ ... }
b(){a();}
}
class Son extends Father{
a(){ ..... }} //override
b() はオーバーライドされません。Son のインスタンスを作成して b() を呼び出すと、Father の a() が呼び出されますが、Son のインスタンスを実行したいと思います (オブジェクトが Son の場合)。出来ますか?
私のアプリの構造は次のようになります。
class Father{
a(){ ... }
b(){a();}
}
class Son extends Father{
a(){ ..... }} //override
b() はオーバーライドされません。Son のインスタンスを作成して b() を呼び出すと、Father の a() が呼び出されますが、Son のインスタンスを実行したいと思います (オブジェクトが Son の場合)。出来ますか?
いいえはい
が静的メソッドでない場合a
、java は動的バインディングを使用するため、息子のa()
メソッドが呼び出されます。
new Son().b()
a()
Sonでメソッドを呼び出します。これを動的バインディングと呼びます。
Son のa
メソッドを呼び出す必要があります。そうでない場合は、 のインスタンスを操作していないかSon
、メソッドを正しくオーバーライドしていません。これは、署名がまったく同じでない場合に発生する可能性があります。署名がまったく同じであることを実装で再確認します。また、 の実装の@Override
上にan を投げてみて、コンパイル エラーが発生するかどうかを確認してください。その場合、メソッドを正しくオーバーライドしていません。Son
a
このような
class Son extends Father{
@Override
a(){ ...}
}
また、a
protected または public のいずれかである必要があります (デフォルトのパッケージ private は、Father
とSon
が同じパッケージ内にある場合にのみ機能します)。つまりSon
、メソッドを「見る」ことができなければなりませんa()
。
What you have should be correct. Method calls are binded lazily. This means that when you call the method a()
anywhere in a Son
object, it will be Son
's method that will be called.
オーバーライドされたメソッドは実行時に解決されますが、オーバーロードされたメソッドはコンパイル時に解決されます。したがって、 new Son().a() を呼び出すだけで十分です。