解释以下Java程序的输出

时间:2013-11-12 07:53:32

标签: java inheritance

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

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

3 个答案:

答案 0 :(得分: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();
}

尝试上面的代码,并从A类和B类实例对象中调用toString函数。然后会更清楚@Override做什么以及它是如何工作的

答案 1 :(得分:2)

好吧,你在toString()的实例上调用B并打印它。 B没有自己的toString(),但会从A继承。{1}}。 toString()中定义的A返回类的名称。因此,当B使用它时,类的名称为com.test.B,这就是返回的内容。
如果你改变A中的实现来返回“hello”,那就是它将返回的内容。

您可能一直期望第一个版本打印com.test.A,因此我将解释为什么不会发生这种情况。
并非B询问AtoString()的结果是什么,B询问A”我需要做些什么才能获得{toString()的结果1}}。在第一种情况下,A告诉B“只返回您的(类)名称”,而在第二种情况下,A告诉B“只是说'你好'”

答案 2 :(得分:1)

使用此toString方法:

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

返回this.getClass().getName(),它返回此Class对象表示的实体名称(类,接口,数组类,基本类型或void),作为String。

当您将toString更改为此时:

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

返回hello,因为您有"hello"作为返回值。