产业气象站|一个类实现多个接口的同名方法会报错吗?

今天和大家讨论一下接口实现的两个问题,众所周知,接口是设计模式的基石,所以了解接口的一些实现对理解设计模式,源码都大有裨益!
接口圈真乱
之所以会提出如标题中的问题,是因为在看ArrayList时,发现接口实现好像有点混乱
产业气象站|一个类实现多个接口的同名方法会报错吗?
文章图片
如上图所示,其实是有两个问题:
AbstractList实现了List接口,然后ArrayList又实现了List接口.这样有问题吗?
Collection接口中有个size()方法,List接口中也有一个size()方法.如果有某个类同时实现Collection和List接口,会不会报错?
实践出真知
首先,我们能正常使用ArrayList说明上面两个问题应该是不成问题的.对于问题1.大家纠结的点应该是在于,对于接口A,如果抽象类B实现了接口,那么子类C在实现接口时,还要不要重写方法
接口Greet/***@date2020/7/2**/publicinterfaceGreet{/***加油的接口定义*/voidcheer()}抽象实现类AbstractGreet/***@date2020/7/2**/publicabstractclassAbstractGreetimplementsGreet{}
这里我们看到抽象类实现接口,要不要去重写方法都不会报错但是通用来说,抽象类的作用就是,要有一个通用的实现,所以一般来说,还是实现方法比较好,然后再抛一个抽象的具体实现,如下所示:
/***@date2020/7/2**/publicabstractclassAbstractGreetimplementsGreet{/***加油的接口定义*/@Overridepublicvoidcheer(){System.out.println("这里通常会做一些通用的处理,比如资源初始化,赋初值之类的")doCheer()}/***留给子类去实现*/publicabstractvoiddoCheer()}真正的子类TrueGreet/***@date2020/7/2**/publicclassTrueGreetextendsAbstractGreetimplementsGreet{/***留给子类去实现*/@OverridepublicvoiddoCheer(){System.out.println("加油加油")}}
在这里可以看到,虽然我们也实现了Greet接口,但是因为AbstractGreet已经实现过了接口,所以这里就不用再实现接口的cheer方法,只需要实现抽象类的doCheer()方法就可以了,当然也可以实现
@Overridepublicvoidcheer(){super.cheer()System.out.println("子类自己的实现")}
这样加上自己的实现也是没有问题的,所以说,像开头AbstractList实现了List接口后,ArrayList是不用再实现List的接口的,实现了不重写其中的方法,编译也不会报错,只能说是让结构更清晰一些.
这里还有一个比较有趣的现象,就是在idea中,要重写方法时,提示的是覆写抽象类的,而不是接口的,如下图所示:
产业气象站|一个类实现多个接口的同名方法会报错吗?
文章图片
报错的场景上面都是正确的,其实有一种报错的场景要注意,就是当两个不同的接口定义的方法签名不一致的时候(方法名,入参一样,返回值不一样)的时候,对于实现类,就找不到该重写哪个了,就会报错,如下所示
GreetCopy接口/***@date2020/7/2**/publicinterfaceGreetCopy{/***加油的接口定义*/Stringcheer()}
和最开始我们定义的Greet接口不一样的是,返回值从void改成了String,
产业气象站|一个类实现多个接口的同名方法会报错吗?
文章图片
【产业气象站|一个类实现多个接口的同名方法会报错吗?】如上图所示,这样编译都是通不过的,但是如果签名换成一样的,就不成问题了.
总结
其实在写本文之前,我也是对这些实现关系不是很清楚,这样边实践边写下来就清晰多了.希望大家也能多实践,也如我一直说的,学编程其实就是多实践,多思考.大家一起加油!
产业气象站|一个类实现多个接口的同名方法会报错吗?
文章图片


    推荐阅读