java源代码理解接口

本文详细介绍了Java接口的概念,包括接口的定义、方法、常量和默认方法。讲解了在JDK1.7之前的接口特性,如只能定义公共方法和常量,并在JDK1.8中新增的默认方法和静态方法。还探讨了接口与类之间的方法冲突解决策略,以及default关键字的作用。此外,文章提到了Java接口在实际开发中的应用,如Collection与Collections,Path与Paths的关系。
摘要由CSDN通过智能技术生成

1、先看概念

  • 百度百科的概念:接口(软件类接口)是指对协定进行定义的引用类型。其他类型实现接口,以保证它们支持某些操作。接口指定必须由类提供的成员或实现它的其他接口。与类相似,接口可以包含方法、属性、索引器和事件作为成员。

  • 再来看一下核心技术卷I对接口的定义:接口用来描述类应该做什么,而不指定他们具体怎么去做。

  • 我自己的理解:

    • 首先感觉它是定义在顶端的,可以被实现
    • 它是用来描述实现该接口的子类统一要去做什么,而不去关心具体实现

2、再来看java的接口

(1)定义自己的接口

我们定义一个接口:用关键字interface定义一个接口

public interface hello1 {
    void f() ;
    final int a = 3;
}

我们的子类

class hello2 implements hello1,hello2 {
    @Override
    public void f() {

    }
}
  • 它可以实现多个接口,只要用“,”隔开就可以

(2)JDK1.7之前接口的默认

在java的接口里面只能去定义两个东西

  • 不带任何东西的方法名称,即后面把后面的“{}”换为“;”:public void f() ;
  • 另外一个是在里面定义常量:final int a = 3;
public interface hello1 {
    void f() ;
    final int a = 3;
}

为什么不用写public 或者private什么的【方法只能用public 或者protected定义,常量只能用public定义】

  • 首先就是里面定义的方法:默认为public
  • 常量也同样是:默认public

(3)JDK1.8中的接口的默认

先来看这样的一张图

有这样的一个需求:当JDK20发布后,在Comparable接口增加了一个方法,希望它的实现类都能拥有这个方法,那完了,谁愿意去改那么多实现类,所以有了这样的一个需求后,就引入了静态方法

interface hello1 {
    public  void f() ;
    final int a = 3;
    public static void hello() {
        System.out.println("hello" + "你好啊");
    }
}

在java的接口里面只能去定义三个东西

  • 不带任何东西的方法名称,即后面把后面的“{}”换为“;”:public void f() ;
  • 另外一个是在里面定义常量:final int a = 3;
  • 它能定义静态方法了

只能这样定义:

  • 首先就是里面定义的方法:默认为public
  • 常量也同样是:默认public
  • 静态方法:用public static定义【也是叫做默认方法】

理论上讲上面情况是完全没有问题的,但是违背了我们接口的初衷,只在里面定义常量和共同方法【但是没有体】,所以有了一个伴随类的概念
在这里插入图片描述

  • 比如我们的Collection和Collections,Path和Paths类。前者作为接口,以后我们要增加的静态方法是放在Paths或者Collections里面。

Paths和Collections都有如下的一个特点,不能去new,咱们去康康源代码
在这里插入图片描述
原来如此:记得看这个文档是不可修改文档啊,不然你们以为我骗你们,构造方法私有化,不能被实例化
在这里插入图片描述
在这里插入图片描述

总结一下:在JDK9和以后都可以用private定义静态方法或者普通方法了

3、java中的default关键字

  • default这个关键字是:默认都知道撒,英语不可能会差到这么离谱
  • 可以用default来定义某一个方法的默认实现在
    在这里插入图片描述
    好像并没有什么卵用对不,我们实现了这个方法里面什么都没有写,却是我们子类的方法来完成。
    其实还是很有用的,就像我们的,为什么后续写到了我们的Iterator这样的迭代器了再来说这个问题【这个涉及到了接口演化的部分知识,你们可以自己搜索看看】

4、解决方法冲突

(1)接口中和超类中定义了一样的方法时

interface hello5 {
    public void f();
}

class hello3 {
    public void f() {

    }
}
class hell2 extends hello3 implements hello5 {

    @Override
    public void f() {

    }
}

在这里插入图片描述

  • 这时候到底选择继承到了是那个方法呢?答案是超类中的方法,没有为什么

(2)当两个接口中定义了同一个方法呢?

在这里插入图片描述
并不是选择其中的一个,而是编译器让你自己来完成后面的操作,所以你自己定义的时候,请不要有这种二义性的问题出现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值