码迷,mamicode.com
首页 > 编程语言 > 详细

java super.getClass问题

时间:2014-12-18 15:15:02      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   color   使用   sp   java   strong   

非常著名的坑了,简单描述就是在A的子类B中某个方法里调用super.get().getName();得到的是A还是B?

答案都是知道,是B。查阅了网上很多说法都是逆推法,例如下例:

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());
    }

}

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">证明思路是:getClass()方法是Object的final方法,是不能被覆盖继承的。也就是说能继承使用,但不能自己重写。然后在Test类里调用getClass().getName();得到的是Test的</span>

类名,因为不是重写的,所以只能是继承的,也就是在Test里调用getClass就等于调用super.getClass;故得证。

但是我总觉得这个解释并不能说服我,然后继续查阅资料,发现这样一种解释:

/**
     * Returns the runtime class of this {@code Object}. The returned
     * {@code Class} object is the object that is locked by {@code
     * static synchronized} methods of the represented class.
     **/

这个是Object中的getClass方法的注释,是指返回此时运行的类。

释义指出,要返回此Object运行时类,这外当然不可能指Object自己了,否则所有类调用getClass()方法都返回Object.class了

这样就比较容易理解了。因为getClass是native的,也就是说是java自己已经实现了的,目的很明确就是返回当前运行对象的类信息,注意是运行的,上方运行的是Test的对象,当然返回的就是Test类信息了。

下面附上一个简单的验证实例:

public class Cat {

	public final void speak(){
		System.out.println("the class==="+getClass().getName());
	}
}
public class RedCat extends Cat{
	
}
public class SmallRedCat extends RedCat{

	public void test(){
		super.speak();
	}
	public static void main(String[] args) {
		SmallRedCat rc = new SmallRedCat();
		rc.test();
		RedCat redCat = new RedCat();
		redCat.speak();
	}
}

运行结果是:

the class===com.test.SmallRedCat
the class===com.test.RedCat

参考:http://www.cnblogs.com/o-andy-o/archive/2012/12/22/2829563.html

java super.getClass问题

标签:style   blog   http   ar   color   使用   sp   java   strong   

原文地址:http://blog.csdn.net/yichenlian/article/details/42005149

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!