您的位置:首页 > 其它

super.getClass()方法调用返回结果的原因

2014-02-19 14:44 579 查看
http://bbs.csdn.net/topics/370010127

看到Java笔试题中有一道关于super的题,题目如下:

下面程序的输出结果是多少?

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

这属于脑筋急转弯的题目,在一个qq群有个网友正好问过这个问题,我觉得挺有趣,就研究了一下,没想到今天还被你面到了,哈哈。

在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()为何返回的还是子类的类型,还是不明白。

后来在网上查了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

*/

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: