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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cbb 中级黑马   /  2014-11-8 07:55  /  2903 人查看  /  26 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.Date;
  2. public class Test extends Date
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 new Test().text();
  7.         }
  8.         public void text()
  9.         {
  10.                 System.out.println(getClass().getSuperclass().getName());
  11.         }
  12. }
复制代码


大家先不编译运行,试想下结果:lol

26 个回复

倒序浏览
  1. import java.util.Date;
  2. public class Test extends Date
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 new Test().text();
  7.         }
  8.         public void text()
  9.         {
  10.                 System.out.println(super.getClass().getName());
  11.         }
  12. }
复制代码


同上这个结果呢?
回复 使用道具 举报
第一个应该是 javs.util.Date因为 getclass会获取当前对象的运行时类而getSuoerclass.会获取这个运行时类的父类类文件所以会获得父类类文件的名字。
第二个结果是Test原因是:super.getClass()是表示调用父类的方法。getClass方法来自Object类,它返回对象在运行时的类。因为在运行时的对象所属的类是Test,所以this.getClass()和super.getClass()都是返回Test。
回复 使用道具 举报
不明觉厉。。
回复 使用道具 举报
2楼出真理
回复 使用道具 举报
好牛,,,,,
回复 使用道具 举报
楼主自己找乐子! 也挺好的
回复 使用道具 举报
乐乐自作主张111
回复 使用道具 举报
cbb 中级黑马 2014-11-8 22:41:32
9#
wf111sxwf 发表于 2014-11-8 11:23
第一个应该是 javs.util.Date因为 getclass会获取当前对象的运行时类而getSuoerclass.会获取这个运行时类的 ...

嗯嗯,当时我被第二个套进去了,一直在super上转~~~
回复 使用道具 举报
Eagle 高级黑马 2014-11-8 22:55:42
10#
不看不知道。看来我也被super搞了。以为两个都是Date。。不过。还是没有明白第二个为什么是Test、、、、愚笨了。。。
回复 使用道具 举报
cbb 中级黑马 2014-11-8 23:21:46
11#
Eagle 发表于 2014-11-8 22:55
不看不知道。看来我也被super搞了。以为两个都是Date。。不过。还是没有明白第二个为什么是Test、、、、愚 ...

在text中直接调用.getClass().getName()肯定返回的是text类名。
但是由于getClass()方法在object中定义的是final类型。
子类并不能覆盖父类的getClass()方法。
所以在子类中调用.getClass().getName()方法,其实就是在调用从父类继承的getClass()方法。
等于调用super.getClass().getName()方法,所以super.getClass().getName()返回的也应该是Test。

:lol我也迷了好久,如果不理解的话,单纯的把这个代码敲上去,运行,也没啥效果~~
回复 使用道具 举报
看了第二个代码:
super并不是表示父类的引用,而是调用父类的方法。

这里test类虽然继承了类Date,但是只是继承了此类的方法,实际上运行的类还是test类的,而此时根本没有Date对象的,如果你把那个super改成new Date()的话这时输出的结果那么就是你刚刚想的结果了。

但是上面的代码为撒输出的是test呢,因为getClass()获取的当前运行的类,既然当前运行的是test那么获取到的名字自然是test了。继承来的都只是方法,并没有被创建对象。

这里我问个问题:为撒我输出下面的内容结果都是class呢
Object o4=new demo().getClass().getSuperclass().getClass().getName();
Object o5=new Date().getClass().getSuperclass().getClass().getName();
System.out.println(o4+"           "+o5);
回复 使用道具 举报
scoto263 发表于 2014-11-9 00:03
看了第二个代码:
super并不是表示父类的引用,而是调用父类的方法。

没有人来回答我这个问题啊。。!!!!
回复 使用道具 举报
报错,getClass()没有对象
回复 使用道具 举报
test                                                         
回复 使用道具 举报
scoto263 发表于 2014-11-9 11:43
没有人来回答我这个问题啊。。!!!!

Object o4 = xxxxxxxx;    多态  你把后面的结果提升为了Objiect类型的  SO  结果你就懂了~~~   我自己是这么想的   不知道对不对  大家一起 讨论  共同进步
回复 使用道具 举报
scoto263 发表于 2014-11-9 00:03
看了第二个代码:
super并不是表示父类的引用,而是调用父类的方法。

我上面回答的错了  ,  唉  我再看看 再回答吧  
回复 使用道具 举报
表示看不懂 回去继续看视频
回复 使用道具 举报
Eagle 发表于 2014-11-8 22:55
不看不知道。看来我也被super搞了。以为两个都是Date。。不过。还是没有明白第二个为什么是Test、、、、愚 ...

getClass()是获取当前运行的类,正在运行中的是test,而它的父类只是被子类继承了方法,并没有创建对象,就是说整个程序中只有一个test对象,咱们这里调用父类的getClass,其实是调用object的getClass,你可以这么理解,咱们test类把所有的方法都集成过来到test类里面了,date和object在内存中其实是没有对象的,唯一的对象只有test
回复 使用道具 举报
这个问题感觉越绕越头晕了。。是不是该请一下黑马的老师来讲解讲解。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马