非常著名的坑了,简单描述就是在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
时间: 2024-11-07 06:09:00