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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© huoxy 中级黑马   /  2014-12-10 22:25  /  1671 人查看  /  10 人回复  /   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().test();
  7.         }

  8.         private void test()
  9.         {
  10.                 System.out.println(super.getClass().getName());
  11.         }

  12. }
复制代码
运行结果是:Test。只有调用getClass().getSuperClass().getName()才能输出Date!为什么调用super.getClass().getName()会得到Test?求大神帮忙解答!越详细越好!

10 个回复

倒序浏览
第一,new Test(),创建了一个test类对象指向的是所有信息都是test的信息.
第二,super.getClass,使用的是父类的方法,但是因为指向的test的信息,也就是说相当于把test的信息传到了父类的方法里。
第三,getClass,返回Class类型对象,而对象中的基本信息都是test的信息
getSuperClass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
调用getSuperClass()就是返回test的父类Class对象,包含的class信息,调用getName自然就是Date了。
回复 使用道具 举报
本帖最后由 奋斗的蜗牛ksd 于 2014-12-10 23:26 编辑

一句话新解释本质
:由于getClass()在Object类中定义成了final,子类不能覆盖该方法

在test方法中,直接调用getClass().getName()方法,返回的是Test类名  
.由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在  test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。  
如果想得到父类的名称,应该用如下代码:  .getClass().getSuperClass().getName();  

为了验证结果测试以下代码
  1. import java.util.Date;

  2. public class Test extends Date
  3. {

  4.         public static void main(String[] args)
  5.         {
  6.                 new Test().test();//让主程序执行test方法而已
  7.         }

  8.         private void test()
  9.         {
  10.                 System.out.println(super.getClass());//输出结果为 class Test
  11.         }

  12. }
复制代码


第二个测试
  1. <p>import java.util.Date;

  2. public class Test extends Date
  3. {

  4.         public static void main(String[] args)
  5.         {
  6.                 new Test().test();
  7.         }

  8.         private void test()
  9.         {
  10.                 System.out.println(this.getClass());//这里结果仍然为class Test
  11.         }

  12. }</p><p> </p><p> </p>
复制代码

当然你可以直接去查阅api验证,更直观。
回复 使用道具 举报
奋斗的蜗牛ksd 发表于 2014-12-10 23:24
一句话新解释本质
:由于getClass()在Object类中定义成了final,子类不能覆盖该方法

我从那个PDF文档看到这段解释了,但还是不明白最后“所以,super.getClass().getName()方法返回的也应该是Test。”这个结论怎么来的?可以这样理解吗:由于Date类中也没有定义getClass()方法,所以getClass().getName()和super.getClass().getName()都是调用的Object类中的getClass()方法,而Object类中的这个方法是返回运行时的类的Class,即在哪个类中调用这个方法,就返回哪个类的Class对象!只能根据结论推断出原因是这样的,不知道理解的对不对!
回复 使用道具 举报
huoxy 发表于 2014-12-11 11:20
我从那个PDF文档看到这段解释了,但还是不明白最后“所以,super.getClass().getName()方法返回的也应该 ...

没错,就是这么理解的
回复 使用道具 举报
好高深,赞一个!
回复 使用道具 举报
quick3g 中级黑马 2014-12-11 15:53:34
7#
又是一个java陷阱啊,学习了。
回复 使用道具 举报
huoxy 发表于 2014-12-11 11:20
我从那个PDF文档看到这段解释了,但还是不明白最后“所以,super.getClass().getName()方法返回的也应该 ...

对的。最关键的话   就是Object类中的这个方法是返回运行时的类的Class,
回复 使用道具 举报
huoxy 中级黑马 2014-12-12 10:21:21
9#
奋斗的蜗牛ksd 发表于 2014-12-11 22:48
对的。最关键的话   就是Object类中的这个方法是返回运行时的类的Class,

:handshake
回复 使用道具 举报
学习了。。
回复 使用道具 举报
赞一个!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马