java1.8新特性之接口

举报
object 发表于 2024/02/26 16:05:29 2024/02/26
【摘要】 目前,虽然java以及发展至java21,但java8(jdk8)作为目前依旧使用最多的jdk版本,无外乎免费的依旧是最香的,且功能足够满足我们日常的使用,所以平时面试时,大多数还是基于java8进行提问,今天总结一下interface的新特性,就当温故而知新了。Interface改动原因旧的jdk1.8由于在接口中新增一个函数后,会要求所有该接口的实现类必须实现新增的方法,对于一些复杂的场...

目前,虽然java以及发展至java21,但java8(jdk8)作为目前依旧使用最多的jdk版本,无外乎免费的依旧是最香的,且功能足够满足我们日常的使用,所以平时面试时,大多数还是基于java8进行提问,今天总结一下interface的新特性,就当温故而知新了。

Interface改动原因

旧的jdk1.8由于在接口中新增一个函数后,会要求所有该接口的实现类必须实现新增的方法,对于一些复杂的场景,编码使用略显不变,于是基于这个原因进行了特性整改

新的jdk1.8可通过关键字 default 和 static修饰函数

1.default修饰的方法,普通示例,可以用this调用,可以被子类继承和重写

2.static修饰的方法,普通的方法,使用和一般静态方法一样,不能被子类继承,只能用Interface调用

default代码示例:

interface ITest1 {
    void def11();

    default void def13() {
        System.out.println("this is interface function");
    }
}

interface ITest2 {
    void def21();
    void def22();
}

class Test implements ITest1 {

    @Override
    public void def11() {

    }

    public static void main(String[] args) {
        new Test().def13(); // 输出 this is interface function
    }
}

static代码示例:

interface ITest1 {
    void def11();

    default void def13() {
        System.out.println("this is interface function");
    }

    static void def14() {
        System.out.println("this is interface static function");
    }
}

interface ITest2 {
    void def21();
    void def22();
}

class Test implements ITest1 {

    @Override
    public void def11() {

    }

    public static void main(String[] args) {
        // new Test().def13();
        ITest1.def14(); // 输出 this is interface static function
    }
}

众所周知,java只有单继承,其中的一项原因就是防止函数冲突,就是父类存在相同的函数时,由于类具有继承性,此时程序便不知道执行哪个函数了,导致了程序的紊乱。接口存在多实现,是因为接口不存在函数体,必须要重写,重复也不所谓, 那么目前接口可以定义函数内容了,实现类同样可以继承,那么遇到冲突了,函数是怎样处理的呢?

答案是:必须重写

代码示例:

interface ITest1 {
    default void def13() {
        System.out.println("ITest1 : this is interface function");
    }
}

interface ITest2 {
    default void def13() {
        System.out.println("ITest2 : this is interface function");
    }
}

class Test implements ITest1,ITest2 {
    public static void main(String[] args) {
         new Test().def13();
    }
}

异常提示:com.xx.Test inherits unrelated defaults for def13() from types com.xx.ITest1 and com.xx.ITest2 

翻译的意思是:Test类从毫无关系的族的ITest1和ITest2接口中继承了def3()函数。   

意思表明ITest1和ITest2无关系,不能同时继承。

更改过后 interface和abstract class的区别

个人见解:接口和抽象类始终最大的区别在于场景的应用,interface的使用场景更多的在于结构性的编程:例如多态的实现,定义函数规范。重在定义结构和规范。 而abstract class更多的应用在代码复用上:例如继承,共享代码。重在复用。使用的场景根据实际环境选择即可。

更加详细的对比如下:

抽象类的使用场景:

  • 代码重用和继承:抽象类可以包含具体的方法实现,因此可以作为其他类的基类,从而实现代码的重用和继承。
  • 共享代码:如果多个相关的类有一些公共的方法实现,可以将这些实现放在抽象类中,避免重复编写。
  • 限制类的实例化: 抽象类无法被实例化,因此可以用于限制某个类的直接实例化,只能通过其子类来创建对象。
  • 约束子类:抽象类可以定义抽象方法,强制子类实现这些方法,从而约束子类的行为。
  • 钩子方法:抽象类可以定义一些具体的方法,但留出某些方法需要子类去实现,以实现模板方法模式。

接口的使用场景:

  • 多继承:Java 不支持多继承,但一个类可以实现多个接口,因此接口可以用于实现类似多继承的特性。
  • 解耦和多态:接口可以用来实现对象的多态性,降低了类之间的耦合度,使得程序更加灵活和可扩展。
  • 定义规范:接口定义了一组方法签名,用于规定实现类必须提供的方法,从而确保实现类的一致性。
  • 实现不相关类的共同行为:接口可以将不相关的类连接起来,使它们拥有共同的行为,从而更好地实现一些横切关注点。
  • 适配器模式:接口可以用于实现适配器模式,允许不相关的类协同工作。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。