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";
}

然后它打印你好。为什么?

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";
}

它将返回hello,因为您已将hello作为返回值返回。

现在,如果您真的想了解,@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 回答
2

好吧,您正在调用toString()一个实例B并打印它。B没有toString()自己的,但继承自A. 中toString()定义的A返回类的名称。所以当B使用它时,类的名称是com.test.B,这就是返回的内容。
如果您将实现更改A为返回“hello”,这就是它将返回的内容。

您可能一直在期待第一个版本 print com.test.A,所以我将解释为什么不会发生这种情况。
不是BA“的结果是什么toString(),而是BA”我必须做什么才能得到结果toString()。在第一种情况下,A告诉B“只返回您的(类)名称”,而在第二种情况下,A告诉B“只说'你好'”。

于 2013-11-12T07:59:20.890 回答
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 回答