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";
}
然后打印你好。为什么呢?
答案 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
询问A
“toString()
的结果是什么,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"
作为返回值。