我定义了以下类:
class BaseClass {
public String toString()
{
return "I am a: " + getClass().getName();
}
}
class DerivedClass {
public String toString()
{
return super.toString();
}
}
在我的 main() 函数中,我有以下代码:
BaseClass b = new BaseClass();
DerivedClass d = new DerivedClass();
System.out.println(b);
System.out.println(d); // not sure why/how this works!
正如预期的那样,当此代码运行时,我确实获得了正确的运行时类类型:
I am a: BaseClass
I am a: DerivedClass
我的问题是,在 DerivedClass 中调用 toString()
究竟是如何工作的?在我的 DerivedClass 重写 toString()
中,我正在调用 super.toString()
,它看起来实际上应该返回“I am a: BaseClass”,因为我们在父类上调用toString()
。
我怀疑这可能与我的基类toString()
利用getClass().getName()
有关,因此当我调用它时通过子类对象,Java 必须检测我的实际对象类型 - 但我不知道它是如何知道这样做的...
抱歉,如果这听起来像是一个菜鸟问题,但我仍然对多态性的概念很困惑。如果有人能解释为什么它会这样工作,我将不胜感激。
最佳答案
getClass()
是一种多态方法。它返回调用它的对象的实际具体类。由于 d
id 类型为 DerivedClass
,因此其 getClass()
方法返回 DerivedClass.class
。
如果方法实现是这样,你就会得到你期望的结果
return "I am a: " + BaseClass.class.getName();
关于java - 在 toString() 方法中使用 getClass().getName(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39258314/