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