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

一、首先,看如下代码,刚看起来似乎是在父类中调用子类的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的实例
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

选你所爱 爱你所选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值