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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 文密 中级黑马   /  2012-4-20 18:42  /  3622 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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
在test方法中,直接调用getClass().getName()方法,返回的是Test类名
由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在
test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。
如果想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName();
    我也做了测试,结果确实是Test,但是我看不明白下面的分析,我觉得他说的模棱两可,没有说明白实质问题。
为此,我查阅了Object的getClass()方法的API,解释是:返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
看了这个,我很清楚this.getClass()是返回运行时对象的类型,但是super.getClass()为何返回的还是子类的类型,还是不明白。求解

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

6 个回复

倒序浏览
事实上,super.getClass()是表示调用父类的方法。getClass方法来自Object类,它返回对象在运行时的类型。因为在运行时的对象类型是Test,所以this.getClass()和super.getClass()都是返回Test。



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



如果想得到父类的名称,应该用如下代码:



Java代码
getClass().getSuperClass().getName();  

回复 使用道具 举报
第一:不管是t1的getclass()还是date的getclass(),他们都是非覆盖式的从object继承来的。
第二:object的getclass()方法的释义是:返回此 object 的运行时类。返回的 class 对象是由所表示类的 static synchronized 方法锁定的对象。
啥是运行时类,运行时类是object的一个实例,注意了,关键来了,他返回的不是object.class,他返回的是运行时类,就是虚拟机中是谁在运行就是谁,如果你new date(),date当然是运行时类,而不是object,否则所有类的getclass()方法都返回了object.class 了。
根据上一段解释,date是object的子类,date.getclass()返回的肯定是date.class,
  同样的t1继承date,假如有一个属于date的getclass()他返回的也不可能是date.class,因为当new t1()后,t1是一个运行时类,只不过他拥有date的资源结构。所以谁被实例化,谁就是一个运行时类。

第三:如果想要从t1中得到date.class,可以用t1.getclass().getsuperclass();
回复 使用道具 举报
super.getClass()并不会返回超类的引用,只是代表调用父类的方法而已。
getClass方法来自Object类,它返回对象在运行时的类型。
由于在运行时的对象类型是Test,所以this.getClass()和super.getClass()都是返回Test。
假如想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName();
回复 使用道具 举报
super.getClass()并不会返回超类的引用,只是代表调用父类的方法而已。
getClass方法来自Object类,它返回对象在运行时的类型。
由于在运行时的对象类型是Test,所以this.getClass()和super.getClass()都是返回Test。
假如想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName();
回复 使用道具 举报
在test方法中,直接调用getClass().getName()方法,返回的是Test类名

     由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在

     test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。

     如果想得到父类的名称,应该用如下代码:

     getClass().getSuperClass().getName();

张老师的原话(貌似现在问题都是张老师面试宝典里的问题???)
回复 使用道具 举报
文密 中级黑马 2012-4-21 18:00:29
7#
今天终于得到了 我想要的答案 了  也与大家分享一下
不管是T1的getClass()还是Date的getClass(),他们都是非覆盖式的从Object继承来的。
Object的getClass()方法的释义是:返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
  什么是运行时类,运行时类是Object的一个实例,注意了,关键来了,他返回的不是Object.class,他返回的是运行时类,就是虚拟机中是谁在运行就是谁,如果你new Date(),Date当然是运行时类,而不是Object,否则所有类的getClass()方法都返回了Object.class 了。
  根据上一段解释,Date是Object的子类,Date.getClass()返回的肯定是Date.class,
  同样的T1继承Date,假如有一个属于Date的getClass()他返回的也不可能是Date.class,因为当new T1()后,T1是一个运行时类,只不过他拥有Date的资源结构。所以谁被实例化,谁就是一个运行时类。
如果想要从T1中得到Date.class,可以用T1.getClass().getSuperClass();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马