java - 在 toString() 方法中使用 getClass().getName()

标签 java polymorphism

我定义了以下类:

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/

相关文章:

java - log4j 记录到 mysql 表

java - 使用 null 参数调用 Class.newInstance 会导致 IllegalArgumentException

polymorphism - Profunctor Iso 不进行类型检查

c# - 可以在虚方法中抛出 NotImplemented 异常吗?

java - 从双数组获取最小值不起作用

java - java STDIN nextLine() 中的扫描器

java - 减少内存流量

c++ - 编译时模板限制 C++

java - 继承类的 protected 静态成员

c# - C#中的接口(interface)多态性