Java 17 接口的用法大全

Java 17 接口的用法大全

思维导图

上一章说了接口的概念定义和基础的实现, 这节我们来说说接口中的继承。继承的关键字还是 extends 。

接口的继承和类的继承不一样, 类只能继承一个, 但是接口支持多继承,因此,一个接口可以继承多个父接口。

和类的继承一致, 子接口继承父接口时, 也会继承父接口的方法,常量。

接口继承的格式如下:

[修饰符] interface 接口名称 [extends] [interface1][,][interface2] {
}

对于接口的继承有点像是功能组合。 业务划分粒度的更细,举个例子, 用台式机来进行举例子。

一台台式机包含:主板 + CPU + 内存 + 硬盘 + 电源 + 机箱

现在有一家组装厂, 想要组装台式机。 然后就可以再定义一个组装的台式机的接口。 由这个接口统一管理各个配件商的接口。

代码如下:

现在有个组装厂商 Build.java 来组装机器, 但是呢这个也就是指定说, 我需要去组装上面的这些配件。 并给出组装方法。 build()。

现在又把这个活外包出去了, 我定义好了规则, 你要按照我的要求给我实现这些配件, 并且给我组装好,并能开机使用。

测试机器的使用:

从一开始单个配件 CPU、硬盘、内存、主板以及电源上, 一直到组装好电脑。 就可以使用上面的代码实现, 并且可以灵活的装配 电脑的配件。 然而在现实的世界中, 组装电脑的可能不会自己生成 CPU。大多数都会直接使用已有的CPU。 比方说有 A 厂和 I 厂, 两家 CPU 厂。修改代码如下:

并且修改 Build.java

public interface Build extends MainBoard, Ram, HardDisk, Power{
   void build();
}

修改电脑的组装方式:

测试运行

当你需要 I 厂CPU 只需要直接使用 ICpu 创建实例即可。

Cpu cpu2 = new ICpu();
Computer computer2 = new Computer(cpu2);
computer2.build();

从上面的组装机器的案例中, 可以看出来, 对于接口来说都是不经常发生变化的。 因为接口在最顶层, 它的任何变化影响的太大太大。 就相当于说硬盘的接口有 SATA 和 M.2 的, 不同的接口实现肯定要单独使用, 不能说今天定义了 SATA 明天又来 SATA 3 那原先的接口规则就需要更新换代了。

对于上面接口的继承可以看出来, 可以解决类不能多继承的问题。并且对于接口而言只能继承接口而不能继承类。

并且对于接口而言是没有构造函数和初始化块的。 这点和类也不一样。

接口与默认方法

在 Java 8 以后 接口增加了默认方法的使用。 就是接口中可以定义方法和方法体, 并在方法体中实现一些通用的功能。

比方说修改 Cpu.java 文件, 加入 default 修饰的默认方法。 这样子类就不需要使用实现方法就可以使用。

public interface Cpu {
    void cpu();
    
    default void version(){
        System.out.println("版本: 1 代");
    }
}

ACpu.java 的代码不变还是如下的代码:

public class ACpu implements Cpu{

    @Override
    public void cpu() {
        System.out.println("A 的 CPU X型号");
    }
    
}

测试类代码修改成如下:

Cpu cpu = new ACpu();
cpu.version();

实现类中并没有实现 version 的方法, 但是在使用的时候, 可以使用父接口的默认实现方法。

接口与私有方法

从 Java 9 开始接口新增了方法体的私有方法。 可以在不需要子接口实现, 又不得不声明方法的时候。

以上面的例子举例。

接口的静态方法

对于接口而言也可以定义静态方法, 也就是“类”方法。


需要注意接口定义 static 的方法调用方式。 必须定义在接口中 static 方法对应的接口才能调用该方法。

接口和抽象类

接口和抽象类有很多相似的地方,通常具备以下的特征:

  • 接口和抽象类都不能实例化, 因为他们都在继承树的最上层, 主要用于被其他的类来实现和继承的。
  • 接口和抽象类都包含有抽象方法,接口的实现和类的继承抽象方法在实现或者继承的时候都必须进行实现包含对应的方法体。

除了上面的相同点, 当然也有不同点, 主要如下几个方面:

  • 接口里只能包含抽象方法、默认方法、静态方法以及私有方法。 抽象类可以包含普通的方法和方法体。
  • 接口里不能包含构造器, 抽象类则可以定义抽象类, 但是定义的抽象类并不是为了实例化, 而是为了一些初始化操作。
  • 接口里只能定义静态常量, 不能定义普通的成员常量。而抽象类中这两者都可以。
  • 接口不能包含初始化块, 抽象类中可以。
  • 一个类只能有一个直接父类(包含抽象类),但是一个类可以实现多个接口。

本节主要说了接口里面的一些最简单的用法。 一定要多多领会其中的使用方法。 动手练。

关注, 收藏, 点赞。 空山不见人,但闻人语响。

当然反馈其中的问题也是思考的一种方式。 评论区见吧!



举报
评论 0