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

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

作者头像
微笑的小小刀
发布2020-06-28 16:12:20
1.2K0
发布2020-06-28 16:12:20
举报
文章被收录于专栏:java技术大本营java技术大本营

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

接口圈真乱

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

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

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

实践出真知

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

接口Greet

代码语言:javascript
复制

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

抽象实现类 AbstractGreet

代码语言:javascript
复制
/**
 * @author lixiang
 * @date 2020/6/18
 **/
public abstract class AbstractGreet implements Greet {
    
}

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

代码语言:javascript
复制

/**
 * @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
复制
/** * @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
复制
@Override
    public void cheer() {
        super.cheer();
        System.out.println("子类自己的实现");
    }

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

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

报错的场景

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

GreetCopy接口

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

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

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

总结

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 接口圈真乱
  • 实践出真知
    • 接口Greet
      • 抽象实现类 AbstractGreet
        • 真正的子类 TrueGreet
        • 报错的场景
          • GreetCopy接口
          • 总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档