Java(4):Java中super和super.getClass()的简介

Java(4):Java中super和super.getClass()的简介_第1张图片


情景再现

这两天,一直看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());       
    }
}
Java(4):Java中super和super.getClass()的简介_第2张图片
打印结果:NewPeople


问题分析

我们分析出现问题的可能就是只有两个方向,一个是super,另外一个就是getClass().

我们先说一下super的概念,super并没有代表超类的一个引用的能力,只是代表调用父类的方法而已。也就是说,你可以使用super来调用父类的方法和属性,但是super并不能代表父类.

那么,这个super概念的解释又有何用呢?我们再看一下getClass()的API中的解释吧,首先在API中getClass()这个方法被定义成** final,也就说这个方法不能被子类重写.并且在API明确指出返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象**,如下图所示.

Java(4):Java中super和super.getClass()的简介_第3张图片



综合上面两点,我们分析出,被static synchronized 方法锁定的对象就是当前类,而且getClass()不管什么对象调用,都是调用Object类中的方法(getClass()不能被重写).所以不管是super.getClass()还是this.getClass()返回的结果都是当前类.

那么想要得到父类,我们该怎么办呢?我们可以使用如下来表示.

XXX.getClass().getSuperClass()




Java(4):Java中super和super.getClass()的简介_第4张图片

你可能感兴趣的:(Java(4):Java中super和super.getClass()的简介)