在Java中,super.getClass()在派生类中输出一个意外的名称 - 为什么会这样?

时间:2016-01-20 07:24:12

标签: java super

你能帮我理解下面代码eof中打印的内容吗?

即使我提到System.out.println(super.getClass().getName());,我也会看到"PrintSubClass3"打印出来。

super

2 个答案:

答案 0 :(得分:1)

super.getClass()调用父类定义的方法getClass()(忽略您在类本身中定义的任何getClass方法 - 不确定是否可以使用{ {1}},可能是getClass)。

这最终调用final,它返回实例的运行时类(就是它的实例,Object#getClass)。

所有PrintSubClass3所做的就是让您调用您无法覆盖的方法的实现,因为您已覆盖它们。在这里,它是多余的,因为superthis.getClass()最终会采用相同的方法。

答案 1 :(得分:0)

getClass()方法返回此Object的运行时类。换句话说,你的obj对象,它是类名PrintSubClass3的对象。因此,它将返回PrintSubClass3

所以在你的课堂内打电话,它会给你自己的课程,即使有super个关键字。有super关键字,它将转到它的superClass来查找方法getClass(),但由于它没有在superClass中显式实现,getClass()方法将工作,因为文档说〜它将返回对象的运行时类。

如果你真的想要打印你的superClass的名字,你应该这样做

 System.out.println(super.getClass().getSuperclass()); 

我希望这会清除你的困惑。

  

打印班级名称的理想方式是什么?

只需输入此内容(您可以不使用超级关键字打印)

     System.out.println(getClass().getName());   //Prints your local class
      System.out.println(getClass().getSuperclass()); //Prints your superClass