0
package com.test;

public class Main {

    public static void main(String[] args) {

        System.out.println(new B().toString());
    }
}


package com.test;

class A {

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.getClass().getName();
    }
}

package com.test;

public class B extends A {

}

このプログラムは出力 com.test.B を提供しますが、クラス A の toString メソッドを

@Override
public String toString() {
    return "hello";
}

次に、hello を出力します。なぜ?

4

3 に答える 3

3

メソッドが次の場合の最初の関数呼び出し:

@Override
public String toString() {
        // TODO Auto-generated method stub
        return this.getClass().getName();
}

このメソッドは B クラスのインスタンスから呼び出されるため、クラス オブジェクトthis.getClass()を参照します。Bしたがって、getName()関数は印刷します

com.test.B

Aクラスオブジェクトを作成することによって同じ関数が呼び出された場合、出力は次のようになります。

com.test.A

そして、toString関数を次のように変更すると:

@Override
public String toString() {
    return "hello";
}

戻り値として を返しhellohelloので、 を返します。

本当に理解したい場合は@Override、このコードをクラス B に追加し、クラス A に関数を返すhelloようにします。

@Override
public String toString() {
     // TODO Auto-generated method stub
     return this.getClass().getName();
}

上記のコードを試して、toStringクラス A とクラス B のインスタンス オブジェクトから関数を呼び出します。@Override次に、何が機能し、どのように機能するかがより明確になります

于 2013-11-12T08:15:09.630 に答える
1

このtoString方法では:

@Override
public String toString() {
        // TODO Auto-generated method stub
        return this.getClass().getName();
}

this.getClass().getName()を返します。これは、この Class オブジェクトによって表されるエンティティ (クラス、インターフェイス、配列クラス、プリミティブ型、または void) の名前を文字列として返します。

そして、これに変更するtoStringと:

@Override
public String toString() {
    return "hello";
}

helloあなたが戻り値として持っているので、その"hello"戻り値。

于 2013-11-12T07:58:42.593 に答える