首页 > 代码库 > java super.getClass问题

java super.getClass问题

非常著名的坑了,简单描述就是在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问题