前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >一个类实现多个接口的同名方法会报错吗?

一个类实现多个接口的同名方法会报错吗?

作者头像
微笑的小小刀
发布于 2020-06-28 08:12:20
发布于 2020-06-28 08:12:20
1.2K00
代码可运行
举报
文章被收录于专栏:java技术大本营java技术大本营
运行总次数:0
代码可运行

大家好,我是小刀,今天和大家讨论一下接口实现的两个问题,众所周知,接口是设计模式的基石,所以了解接口的一些实现对理解设计模式,源码都大有裨益!

接口圈真乱

之所以会提出如标题中的问题, 是因为在看ArrayList时,发现接口实现好像有点混乱

如上图所示,其实是有两个问题

  1. AbstractList 实现了List接口, 然后ArrayList又实现了List接口. 这样有问题吗?
  2. Collection接口中有个size()方法, List接口中也有一个size()方法. 如果有某个类同时实现CollectionList接口, 会不会报错?

实践出真知

首先,我们能正常使用ArrayList 说明上面两个问题应该是不成问题的.对于问题1. 大家纠结的点应该是在于, 对于接口A, 如果抽象类B实现了接口,那么子类C在实现接口时,还要不要重写方法

接口Greet

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

/**
 * @author lixiang
 * @date 2020/6/16
 **/
public interface Greet {
    /**
     * 加油的接口定义
     */
     void cheer();
}

抽象实现类 AbstractGreet

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author lixiang
 * @date 2020/6/18
 **/
public abstract class AbstractGreet implements Greet {
    
}

这里我们看到抽象类实现接口,要不要去重写方法都不会报错但是通用来说, 抽象类的作用就是,要有一个通用的实现,所以一般来说,还是实现方法比较好, 然后再抛一个抽象的具体实现, 如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

/**
 * @author lixiang
 * @date 2020/6/18
 **/
public abstract class AbstractGreet implements Greet {
    /**
     * 加油的接口定义
     */
    @Override
    public void cheer() {
        System.out.println("这里通常会做一些通用的处理,比如资源初始化,赋初值之类的");
        doCheer();
    }

    /**
     * 留给子类去实现
     */
    public abstract void doCheer();

真正的子类 TrueGreet

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** * @author lixiang * @date 2020/6/17 **/public class TrueGreet extends AbstractGreet implements Greet {
    /**     * 留给子类去实现     */    @Override    public void doCheer() {        System.out.println("加油加油");    }}

在这里可以看到,虽然我们也实现了Greet接口,但是因为AbstractGreet 已经实现过了接口,所以这里就不用再实现接口的cheer方法, 只需要实现抽象类的doCheer()方法就可以了,当然也可以实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
    public void cheer() {
        super.cheer();
        System.out.println("子类自己的实现");
    }

这样加上自己的实现也是没有问题的,所以说, 像开头AbstractList实现了List接口后, ArrayList是不用再实现List的接口的, 实现了不重写其中的方法,编译也不会报错, 只能说是让结构更清晰一些.

这里还有一个比较有趣的现象,就是在idea中, 要重写方法时, 提示的是覆写抽象类的,而不是接口的,如下图所示:

报错的场景

上面都是正确的,其实有一种报错的场景要注意, 就是当两个不同的接口定义的方法签名不一致的时候(方法名,入参一样,返回值不一样)的时候,对于实现类,就找不到该重写哪个了,就会报错,如下所示

GreetCopy接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author lixiang
 * @date 2020/6/17
 **/
public interface GreetCopy {
    /**
     * 加油的接口定义
     */
    String cheer();
}

和最开始我们定义的Greet接口不一样的是, 返回值从void 改成了String,

如上图所示, 这样编译都是通不过的, 但是如果签名换成一样的,就不成问题了.

总结

其实在写本文之前,小刀也是对这些实现关系不是很清楚, 这样边实践边写下来就清晰多了.希望大家也能多实践,也如我一直说的,学编程其实就是多实践,多思考. 大家一起加油!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java技术大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
抽象类和接口(2)(接口部分)
那现在我们就开始接口的学习吧。(接口这部分作者打算两篇文章介绍完)
E绵绵
2024/04/08
850
抽象类和接口(2)(接口部分)
(52) 抽象容器类 / 计算机程序的思维逻辑
查看历史文章,请点击上方链接关注公众号。 从38节到51节,我们介绍的都是具体的容器类,上节我们提到,所有具体容器类其实都不是从头构建的,它们都继承了一些抽象容器类。这些抽象类提供了容器接口的部分实现,方便了Java具体容器类的实现,理解它们有助于进一步理解具体容器类。 此外,通过继承抽象类,自定义的类也可以更为容易的实现容器接口。为什么需要实现容器接口呢?至少有两个原因: 容器类是一个大家庭,它们之间可以方便的协作,比如很多方法的参数和返回值都是容器接口对象,实现了容器接口,就可以方便的参与进这种协作。
swiftma
2018/01/31
7110
(52)  抽象容器类 / 计算机程序的思维逻辑
07 接口和抽象类
比抽象类更加抽象的是接口,在接口中所有的方法都会被 public abstract 修饰。
acc8226
2022/05/17
3110
【JAVA】抽象类和接口
定义一个类时常常需要定义一些成员方法用于描述类的行为特征,但有时这些方法的实现方式是无法确定的。例如上期定义的 Animal类中的 shout()方法用于描述动物的叫声,但是不同的动物叫声也不相同,因此在 shout()方法中无法准确描述动物的叫声。
颜颜yan_
2022/12/18
8630
【JAVA】抽象类和接口
13谈谈接口和抽象类有什么区别?
Java是非常典型的面向对象语言,曾经有一段时间,程序员整天把面向对象、设计模式挂在嘴边。虽然如今大家对这方面已经不再那么狂热,但是不可否认,掌握面向对象设计原则
灬沙师弟
2022/09/10
2840
一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/10/08
1.5K0
接口和抽象类/方法学习 demo
抽象类:抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类,抽象类有点类似于“模板”的作用,目的是根据其格式来创建和修改新的类,对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象,当一个类被声明为抽象类时,要在这个类前面加上修饰符abstract,在抽象类中的成员方法可以包括一般方法和抽象方法
默 语
2024/11/20
450
JDK源码——利用模板方法看设计模式
第一,把冰箱门打开;第二,把大象放进去;第三,把冰箱门关上。我们可以看见,这个问题的答案回答的很有步骤。接下来我们介绍一种设计模式——模板方法模式,你会发现,它与这个问题的答案实际上有很多共同之处。
本人秃顶程序员
2019/04/25
6910
JDK源码——利用模板方法看设计模式
【Java 学习】:抽象类&接口
💢💢在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
IsLand1314
2024/10/15
1660
【Java 学习】:抽象类&接口
JDK动态代理一定要有代理对象吗?请结合Mybatis回答
有一段时间没有写文章了, 主要是回想起这两年多的时间,多多少少,每个知识点差不多都有写到了, 一时也想不起什么新鲜的知识分享给大家. 今天写动态代理,主要是在看Mybatis源码时,发现真的是把动态代理用的是太6 了, 感叹之余,有一些心得,和大家分享一下.
微笑的小小刀
2020/06/19
4090
Java抽象类+接口
1)抽象类的关键字就是abstract,加上这个关键字之后就表示这个类就是一个抽象类;
阑梦清川
2025/02/24
460
Java抽象类+接口
Java 中接口和抽象类的 7 大区别!
Java 是一门面向对象的编程语言,面向对象的编程语言有四大特征:抽象、封装、继承和多态。 而本文介绍的接口和抽象类就是面向对象编程中“抽象”的具体实现,也就是说接口和抽象类都是用来定义实体类的公共行为的,它们是对实体类(对象)更高层次的抽象。​
磊哥
2021/12/27
1.6K0
Java 中接口和抽象类的 7 大区别!
【JAVA抽象类和接口】
在Java中Object类是所有类的父类。默认它们都继承了Object这个父类,所有类的引用都可以用Object的引用来进行接收。
ImAileen
2024/12/08
1590
【JAVA抽象类和接口】
抽象类和接口(1)(抽象类部分)
shape此时为抽象类类型,所以这时用它实例化创建对象就报错了。 所以抽象类的出现,就是要被继承,只有继承了抽象类才能使用它。
E绵绵
2024/04/08
920
抽象类和接口(1)(抽象类部分)
我是如何理解Java抽象类和接口的?
在面试中我们经常被问到:Java中抽象类和接口的区别是什么? 然后,我们就大说一通抽象类可以有方法,接口不能有实际的方法啦;一个类只能继承一个抽象类,却可以继承多个接口啦,balabala一大堆,就好像把标准答案熟练的说出来一样。 抽象类和接口这篇文章讲到了他们的区别和联系,它们确实有很多相似的地方,但是从本质上看,或从语言的设计角度来看,这不是它们最本质的区别。 不卖关子,我个人对这两个的理解: 类是具体实例的抽象,比如一个json字符串的抽象;而抽象类就是类的抽象;接口就是抽象类的抽象,接口更像是一种
三哥
2018/06/15
8050
Javase-12.抽象类和接口
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的, 如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
用户11369350
2024/11/19
500
Javase-12.抽象类和接口
【Java基础语法】抽象类和接口
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
用户11288949
2024/09/24
840
【Java基础语法】抽象类和接口
简述Java抽象方法、抽象类和接口
面向对象有三个特征——封装、继承、多态,以及介绍方法的重载和重写,这些都是开发中很常用的特征,基本都尊重面向对象思想。了解到了继承的时候,子类要重新写父类的方法,才能遵循子类的规则,那么忘记重写怎么办呢?所以本讲,我们讲解Java的抽象类和接口,这个跟继承有点类似,但是实现的子类必须实现对应的方法。
小明爱吃火锅
2023/09/22
7102
教妹学 Java 第 26 讲:接口
“哥,我看你朋友圈说《教妹学 Java》专栏收到了第一笔赞赏呀,虽然只有一块钱,但我也替你感到开心。”三妹的脸上洋溢着自信的微笑,仿佛这钱是打给她的一样。
沉默王二
2021/05/11
2630
【Java】用一个动物王国的例子,讲清楚抽象类和接口
在这个抽象类中,我们定义了动物的基本属性和它们应该有的行为,但没有给出具体的实现方法。这就是像在说:“所有的动物都会吃和睡觉,但没中动物的方式都不同,所以你们(子类)自己去实现吧。”
椰椰椰耶
2024/10/15
1750
【Java】用一个动物王国的例子,讲清楚抽象类和接口
相关推荐
抽象类和接口(2)(接口部分)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文