为什么可以通过反射在父类中写调用子类中的方法的代码【此标题不严谨】

一、首先,看如下代码,刚看起来似乎是在父类中调用子类的show()方法,可是仔细想想并不是那么回事,在如下代码的Father类中的hit()方法中用到了反射机制,我们知道反射机制所体现的就是动态性,也就是说,结果只有在运行起来之后(动起来之后)才可以确定结果,代码如下:

public class Father {
    public void hit(String name) throws Exception{
        Method show = this.getClass().getDeclaredMethod("show",String.class);
        // 此处调用了 show 方法
        show.invoke(this, name);
        System.out.println("父亲:" + name);
    }
}
class Son extends Father{
    public void show(String name){
        System.out.println("son:" + name);
    }
}
class te{
    public static void main(String[] args) throws Exception {
        Son son = new Son();
        son.hit("jack");
    }
}

运行结果:
son:jack
父亲:jack

二、通过如上代码的运行结果,我们可以看到,使用反射的这种方式调用不是一种显示的调用(obj.method() );我们也可以看到,在Father父类的hit()方法中调用了Son子类的show()方法,能这样运行并且不报错的原因是:
1.Son继承了Father类,构成子父类关系
2.在另一个类的main方法中实例化了Son子类,又由于子类继承的Father类,所以Son类包含Father类所有的非私有方法(私有方法子类不可显示调用,可通过反射去调用)
图一:通过debug看到Father类中,hit方法中的this就是Son的实例
在这里插入图片描述

posted @ 2021-08-27 17:36  正伯Pro  阅读(13)  评论(0)    收藏  举报  来源