私のアプリの構造は次のようになります。
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 を投げてみて、コンパイル エラーが発生するかどうかを確認してください。その場合、メソッドを正しくオーバーライドしていません。Sona
このような
class Son extends Father{
@Override
a(){ ...}
}
また、aprotected または 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() を呼び出すだけで十分です。