M06494h:
ここで私は見ていますと同様の方法で、親に存在し、参照が型の親であるが、ときにオブジェクトが型の場合、JVMは、常に、子クラスのメソッドを探し理由を知りたいとのコード例はあります子。
class A{
public void saveLink(){
System.out.println("A: saveLink");
bookmark();
}
public void bookmark() {
System.out.println("A: bookmark");
}
}
class B extends A{
public void bookmark(){
System.out.println("B: bookmark");
}
}
class C extends B{
}
class Test {
public static void main(String[] args) {
A a = new A();
A b = new B();
A c = new C();
c.saveLink();
}
}
私は上記のコードを実行すると、それが出力されます。
A: saveLink
B: bookmark
誰かがもっとこのことについて説明していただけますか?
ernest_k:
これは、多型はJavaで実装されている方法の一つです。これは、動的バインディングと呼ばれています。
実行時に実行される実装では、メソッドが呼び出されたオブジェクトの実際のクラスを調べることによって決定されます。
あなたが宣言するときに、あなたのケースでは、A b = new B();
その後、電話をしてb.bookmark()
、Javaの実行時に最初に見える、オブジェクトの実際の型は、(B
オブジェクトがで作成されたとして、実行時の型であるnew B()
にかかわらず、その静の、または宣言の宣言された型(すなわち、regarlessは)オブジェクトを指す変数)のタイプ。
Javaは(これはオブジェクトの場合の方法は、ランタイムクラスでオーバーライドされたことを確認するとb
、あなたの例では)、その実装を実行します。そうでなければ、それはあなたが述べてきたように(これはオブジェクトの場合で、継承された実装を見つけるために、クラス階層を歩くc
あなたの例では)。
ご注意ください:
- この動作は、ちょうどのためにのためにあるインスタンスメソッド(それは静的メソッドやフィールドには適用されません)。静的メソッドを宣言/静的な型に基づいて選択されます。
- 例外は(私は考えることができること)があります:コールがで行われたときに
super.bookmark()
、その後、Javaは、必ずしも、スーパークラスの実装を実行します-これはあなたの例では、シナリオではありません。