2016-10-23 8 views
4

私はこれを実行しています。なぜこれが実行され、両方の行にBBが印刷されるのか理解できません。Javaの継承なぜtoStringはAB、ABではなくBBを出力するのですか?

class A { 
    public String toString(){ 
     return this.getClass().getSimpleName(); 
    } 
} 

class B extends A { 

    public String toString(){ 
     return super.toString() + this.getClass().getSimpleName(); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 

    A a = new B(); 
    B b = new B(); 
    System.out.println(a); 
    System.out.println(b); 
    } 
} 
+0

これは両方ともクラスBのオブジェクトなので、 – dunni

+0

なぜですか? 'A a = new B();'なので、 'a'は実際に' B'のインスタンスです。 –

答えて

3

javaにはオブジェクトごとに1つのクラス名しかありません。スーパークラスの名前を知りたい場合は、getClass().getSuperclass().getSimpleName()を使用する必要があります。

両方のオブジェクトがnew B()なので、あなたがsuper.toString()toString()を呼び出している場合、あなたはnewを使用して作成したクラスのgetClass()リターンは常に名前ので両方は、クラスBの名前を返しますが、重要ではありません。

+0

はい、なぜ親スーパークラスを呼び出すのですか?クラス名はAですか? – SantiagoM

+2

少し丸い@SantiagoMスーパーは、getClassを呼び出すAのtoStringを呼び出します。オブジェクトがタイプBであるため、getClassはBを返します。 –

+0

ありがとう – SantiagoM

関連する問題