3

私のアプリの構造は次のようになります。

class Father{
a(){ ... }

b(){a();}
}

class Son extends Father{
a(){ ..... }} //override

b() はオーバーライドされません。Son のインスタンスを作成して b() を呼び出すと、Father の a() が呼び出されますが、Son のインスタンスを実行したいと思います (オブジェクトが Son の場合)。出来ますか?

4

4 に答える 4

5

いいえはい

  • いいえ: 「Son のインスタンスを作成して b() を呼び出すと、Father の a() が呼び出されます」それは違います。
  • はい: 「しかし、Son を実行したいと思います (オブジェクトが Son の場合)。それは可能ですか?」-- それがJavaの振る舞いです

が静的メソッドでない場合a、java は動的バインディングを使用するため、息子のa()メソッドが呼び出されます。

new Son().b()a()Sonでメソッドを呼び出します。これを動的バインディングと呼びます。

于 2011-08-10T18:51:01.423 に答える
4

Son のaメソッドを呼び出す必要があります。そうでない場合は、 のインスタンスを操作していないかSon、メソッドを正しくオーバーライドしていません。これは、署名がまったく同じでない場合に発生する可能性があります。署名がまったく同じであることを実装で再確認します。また、 の実装の@Override上にan を投げてみて、コンパイル エラーが発生するかどうかを確認してください。その場合、メソッドを正しくオーバーライドしていません。Sona

このような

class Son extends Father{
  @Override
  a(){ ...}
}

また、aprotected または public のいずれかである必要があります (デフォルトのパッケージ private は、FatherSonが同じパッケージ内にある場合にのみ機能します)。つまりSon、メソッドを「見る」ことができなければなりませんa()

于 2011-08-10T18:55:12.583 に答える
-1

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.

于 2011-08-10T18:53:40.763 に答える
-1

オーバーライドされたメソッドは実行時に解決されますが、オーバーロードされたメソッドはコンパイル時に解決されます。したがって、 new Son().a() を呼び出すだけで十分です。

于 2011-08-10T19:00:03.547 に答える