子类实现接口,接口中有方法和父类成员方法同名,到底算谁的?

问题描述

在梳理代码时,看到这么一个代码。

子类实现接口,接口中有方法和父类成员方法同名。

这就让我感觉很难受了,编译肯定没问题,从接口层面上调用,应该也是会走子类的实现方法的,那么是不是说变相的父类也算实现了这个接口?

结论先行

子类实现接口,接口中有方法和父类成员方法同名时,接口调用会走子类实现,父类并不算时实现了这个接口,即接口不能指向父类对象,单子类中可以不实现这个接口,这时候走的就是父类的代码,但是父类方法必须是public的,否则编译失败。

猜测的原理

子类在编译过程中会自动具有父类的protected和public接口,所以在编译过程中,子类虽然没有显示的实现该接口,但也能编译过,这也能解释为什么protected的不行,就是继承、实现接口时,子类访问权限不能低于父类权限,而interface默认接口权限为public。子类不实现的话,接口权限不满足。

测试代码

public class ClassFather {
    protected void test() {
        System.out.println("father print");
    }
}

public class ClassChild extends ClassFather implements InterfaceA {
    @Override
    public void test() {
        System.out.println("Child print");
    }
}

public interface InterfaceA {
    void test();
}

public class TestMain {
    public static void main(String[] args) {
        ClassFather cf = new ClassFather();
        cf.test();

        ClassChild cc = new ClassChild();
        cc.test();

        InterfaceA interfaceA = new ClassChild();
        interfaceA.test();

        // interfaceA = cf; // 编译报错
    }
}

思考

这么写代码执行应该是没问题的,毕竟通过接口只能指向子类的实现,但是对于后期加入项目的人员来说,维护成本略高,不利于理解,在修改代码时很容易改成父类方法,造成修改不生效,不要这么写代码!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kiba_zwei

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

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

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

打赏作者

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

抵扣说明:

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

余额充值