2017-11-29 8 views
-1

私はこれらの2つのクラスを持っており、なぜ出力がA,BB.xxxであるのかを知りたいと思います。誰かがキャストされたときになぜそれがA.xxxではないのか説明できますか?あなたが相続...フォームBが延びキャストオブジェクトと継承

A my_A = new B() 

の変数の初期化を持っているときに

public abstract class A { 
    public A() { 
     System.out.println("A"); 
    } 

    public void xxx() { 
     System.out.println("A.xxx"); 
    } 

    abstract void yyy(); 
} 

public class B extends A { 
    public B() { 
     System.out.println("B"); 
    } 

    public void xxx() { 
     System.out.println("B.xxx"); 
    } 

    public void yyy() { 
     System.out.println("B.yyy"); 
    } 
} 

public class ClassRunner { 
    public static void main(String[] args) { 
     B b2 = new B(); 
     ((A)b2) .xxx();  
    } 
} 
+0

https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – shmosel

答えて

0

...である:ここでは

は私の二つのクラスとの主な方法です変装と呼ばれる。 AのオブジェクトとしてBのインスタンスを偽装しています。そして、経験則では、等号(A)の左側にあるクラスが、あなたのオブジェクトに対してどのメソッドを呼び出すことができるかを定義しています。クラスAには ".xxx()"メソッドがあるので、これを使用することができます。一方、等号の右側のクラスは、使用する.xxx()メソッドの実際のバージョンを定義します。クラスBは右側にあるため、Bのバージョンの.xxx()を使用します。 Bに.xxx()がない場合、デフォルトではAのバージョンが使用されます。

+0

等辺の両辺がBであるため、Bクラスのメソッドを使用するとは限りませんキャストの? –

+0

b2を(A)b2でAにキャストしたとき、左側はAになりますが、基礎となるオブジェクトは依然としてBのインスタンスなので、Bのバージョンのxxx()を使用します。 – Solace