黑马程序员技术交流社区

标题: 黑马云青年——子类得到父类的类名问题 [打印本页]

作者: xiewen    时间: 2013-5-25 22:36
标题: 黑马云青年——子类得到父类的类名问题
本帖最后由 xiewen 于 2013-5-26 00:42 编辑

import java.util.Date;
public  class Test extends Date{
public static void main(String[] args) {
new Test().test();
}
public void test(){
System.out.println(super.getClass().getName());
}
}
     很奇怪,结果是Test,为什么?


作者: 袁梦希    时间: 2013-5-25 22:51
楼主你好
其实最后输出的时候用到了反射的概念,打印结果应该是Test,那么为什么呢?

原因:
在test()方法中,直接调用getClass().getName()方法,返回的是Test类名。由于getClass()在Object类中定义成了final,子类不能覆盖该方法
所以,在test()方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,
因此,super.getClass().getName()方法返回的也应该是Test。

希望能够帮到你,菜鸟云青年解答。。
作者: xiewen    时间: 2013-5-25 23:17
袁梦希 发表于 2013-5-25 22:51
楼主你好,
其实最后输出的时候用到了反射的概念,打印结果应该是Test,那么为什么呢?

我还是不懂!
作者: 神之梦    时间: 2013-5-25 23:30
袁梦希 发表于 2013-5-25 22:51
楼主你好,
其实最后输出的时候用到了反射的概念,打印结果应该是Test,那么为什么呢?

反射我也不懂:lol
作者: 袁梦希    时间: 2013-5-25 23:39
本帖最后由 袁梦希 于 2013-5-25 23:51 编辑
xiewen 发表于 2013-5-25 23:17
我还是不懂!


我查阅了Object的getClass()方法的API,解释是:返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
看了这个,我很清楚this.getClass()是返回运行时对象的类型,但是super.getClass()为何返回的还是子类的类型,还是不明白。
后来在网上查了super的含义,有一个帖子说super不是超类的引用,而是表示在子类中调用父类的方法或属性而已,并且给出例子
class B extends A{
       public void print(){
              System.out.println(super.getClass());//调用A类中的getclass()方法,A是Object的子类,A中的getClass()是Object中的,运行时期的实例是B类,所以输出的依然是Class B
              System.out.println(this.getClass()); //调用B类中的getclass()方法,此方法从A继承的,A从Object继承的,运行时期的实例是B类,所以输出的是Class B

              /*上面的super.getClass()和this.getClass()都是调用的Object中的getClass(),而super.getClass()和this.getClass()都是通过实例化B类,调用print(),从而调用这两个方法,运行时期的类都是B,Object中的getClass()返回的是运行时期的类 名,所以输出都是Class B
              */
}
我认为后面的解释更加说的通一些,但是我不确定解释是不是正确,所以,发到版上来,请版上的高手帮忙看一下,给出合理的解释。因为这道笔试题的所谓答案也已经被转载了很多次了,如果解释真是不正确了,那就蒙蔽了很多人了。。。



作者: 曹睿翔    时间: 2013-5-25 23:54
袁梦希 发表于 2013-5-25 23:39
我查阅了Object的getClass()方法的API,解释是:返回此 Object 的运行时类。返回的 Class 对象是由所表示 ...

团长回答的很好,还给查了API,又查了资料,能很好解释这个原因,不明白继续问
作者: 曹睿翔    时间: 2013-5-25 23:54
袁梦希 发表于 2013-5-25 23:39
我查阅了Object的getClass()方法的API,解释是:返回此 Object 的运行时类。返回的 Class 对象是由所表示 ...

团长回答的很好,还给查了API,又查了资料,能很好解释这个原因,不明白继续问
作者: 曹睿翔    时间: 2013-5-25 23:54
袁梦希 发表于 2013-5-25 23:39
我查阅了Object的getClass()方法的API,解释是:返回此 Object 的运行时类。返回的 Class 对象是由所表示 ...

团长回答的很好,还给查了API,又查了资料,能很好解释这个原因,不明白继续问
作者: 曹睿翔    时间: 2013-5-25 23:55
袁梦希 发表于 2013-5-25 23:39
我查阅了Object的getClass()方法的API,解释是:返回此 Object 的运行时类。返回的 Class 对象是由所表示 ...

团长回答的很好,还给查了API,又查了资料,能很好解释这个原因,不明白继续问
作者: xiewen    时间: 2013-5-26 00:42
本帖最后由 xiewen 于 2013-5-26 00:45 编辑
袁梦希 发表于 2013-5-25 23:39
我查阅了Object的getClass()方法的API,解释是:返回此 Object 的运行时类。返回的 Class 对象是由所表示 ...

太好了,谢谢了,我明白了!女孩子太晚睡对身体不好。你每天晚上要早点休息。
作者: 袁梦希    时间: 2013-5-26 00:43
xiewen 发表于 2013-5-26 00:42
太好了,谢谢了,我明白了!女孩子太晚睡对身体不好,你应该早点休息

我是纯爷们  :)
作者: xiewen    时间: 2013-5-26 00:46
袁梦希 发表于 2013-5-26 00:43
我是纯爷们

你不是用一个女孩子的名字吗?
作者: 袁梦希    时间: 2013-5-26 00:49
xiewen 发表于 2013-5-26 00:46
你不是用一个女孩子的名字吗?

我是男的,都说我像女孩的名字
作者: xiewen    时间: 2013-5-26 00:50
袁梦希 发表于 2013-5-26 00:49
我是男的,都说我像女孩的名字

是吗?我一直以为你是一个女孩子!非常抱歉!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2