A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiewen 中级黑马   /  2013-5-25 22:36  /  2011 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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,为什么?

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
袁梦希 + 1 + 3 很给力!

查看全部评分

12 个回复

倒序浏览
楼主你好
其实最后输出的时候用到了反射的概念,打印结果应该是Test,那么为什么呢?

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

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

我还是不懂!
回复 使用道具 举报
袁梦希 发表于 2013-5-25 22:51
楼主你好,
其实最后输出的时候用到了反射的概念,打印结果应该是Test,那么为什么呢?

反射我也不懂:lol
回复 使用道具 举报
本帖最后由 袁梦希 于 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
              */
}
我认为后面的解释更加说的通一些,但是我不确定解释是不是正确,所以,发到版上来,请版上的高手帮忙看一下,给出合理的解释。因为这道笔试题的所谓答案也已经被转载了很多次了,如果解释真是不正确了,那就蒙蔽了很多人了。。。


评分

参与人数 1技术分 +2 收起 理由
曹睿翔 + 2 你是在爆发啊,没贴必回,有问必答.

查看全部评分

回复 使用道具 举报
袁梦希 发表于 2013-5-25 23:39
我查阅了Object的getClass()方法的API,解释是:返回此 Object 的运行时类。返回的 Class 对象是由所表示 ...

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

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

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

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

太好了,谢谢了,我明白了!女孩子太晚睡对身体不好。你每天晚上要早点休息。
回复 使用道具 举报
xiewen 发表于 2013-5-26 00:42
太好了,谢谢了,我明白了!女孩子太晚睡对身体不好,你应该早点休息

我是纯爷们  :)
回复 使用道具 举报
袁梦希 发表于 2013-5-26 00:43
我是纯爷们

你不是用一个女孩子的名字吗?
回复 使用道具 举报
xiewen 发表于 2013-5-26 00:46
你不是用一个女孩子的名字吗?

我是男的,都说我像女孩的名字
回复 使用道具 举报
袁梦希 发表于 2013-5-26 00:49
我是男的,都说我像女孩的名字

是吗?我一直以为你是一个女孩子!非常抱歉!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马