情景再现
这两天,一直看Java,结果在继承这块遇到了一个问题,就是使用super调用getClass()这个方法的时候,打印出来的结果却是当前类的类名.如下代码和打印结果所示.
public class People {
public static void main(String[] args) {
NewPeople newPeople = new NewPeople();
newPeople.printClassName();
}
}
class NewPeople extends People {
public void printClassName() {
System.out.println(super.getClass());
}
}
问题分析
我们分析出现问题的可能就是只有两个方向,一个是super,另外一个就是getClass().
我们先说一下super的概念,super并没有代表超类的一个引用的能力,只是代表调用父类的方法而已。也就是说,你可以使用super来调用父类的方法和属性,但是super并不能代表父类.
那么,这个super概念的解释又有何用呢?我们再看一下getClass()的API中的解释吧,首先在API中getClass()这个方法被定义成** final,也就说这个方法不能被子类重写.并且在API明确指出返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象**,如下图所示.
</br>
综合上面两点,我们分析出,被static synchronized 方法锁定的对象就是当前类,而且getClass()不管什么对象调用,都是调用Object类中的方法(getClass()不能被重写).所以不管是super.getClass()还是this.getClass()返回的结果都是当前类.
那么想要得到父类,我们该怎么办呢?我们可以使用如下来表示.
XXX.getClass().getSuperClass()