Bootstrap

java一个接口多个实现类怎么调用_Java面向对象之:接口、多态

e6443e80584f131957e147f2d96a69b3.png

本篇我们将学习面向对象中的接口和多态:

第一章:接口

1.1-接口概述(了解)

什么是接口

Java中的接口是 一系列方法的声明 ,是一些 方法特征的集合 。

一个接口 只有方法的特征(只有声明) 没有 方法的实现(没有方法体) ,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)

如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是 封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8)。

总而言之,Java中的接口就是一系列方法声明的集合。

为什么需要接口

接口的优势:

  • 是多态的基础
  • 可以多实现(可以理解为多继承)

接口是一种引用数据类型

接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。

类和接口都是java代码,都会转换为字节码文件

public class 类名.java → 类名.class

public interface 接口名.java → 接口名.class

1.2-接口的定义格式(记忆)

定义格式:关键字 interface

public interface 接口名称 {
    // 抽象方法
    // 默认方法
    // 静态方法
}

接口中定义抽象方法

抽象方法:使用 abstract 关键字修饰,可以省略,没有方法体。该方法供子类实现使用。

public interface InterFaceName {
    public abstract void method();
}

接口中定义默认方法和静态方法

默认方法:使用 default 修饰,不可省略,供子类调用或者子类重写。

静态方法:使用 static 修饰,供接口直接调用。

public interface InterFaceName {
    public default void method() {
        // 执行语句
    }
    public static void method2() {
        // 执行语句    
    }
}

1.3-接口的使用方式(记忆)

我们之前学习继承时,父类需要子类继承。而接口和继承中父类相似,也需要一个类似子类的实现类来实现接口。

接口的实现

类与 接口 的关系为实现关系,即 类实现接口 ,该类可以称为接口的 实现类 ,也可以称为 接口的子类

实现的动作类似继承,格式相仿,只是关键字不同,实现使用 implements 关键字。

非抽象类实现接口注意事项

  1. 必须重写接口中所有抽象方法。
  2. 继承了接口的默认方法,即可以直接调用,也可以重写。

子类实现接口格式

public class 类名 implements 接口名 {
    // 重写接口中抽象方法【必须】
      // 重写接口中默认方法【可选】
}

子类实现接口中的 抽象方法

对于接口中定义的抽象方法,子类必须全部实现(重写)。代码如下:

定义一个接口:LiveAble

public interface LiveAble {
    // 定义抽象方法
    public abstract void eat();
    public abstract void sleep();
}

定义一个实现类:Animal

public class Animal implements LiveAble {
    @Override
    public void eat() {
        System.out.println("吃东西");
    }

    @Override
    public void sleep() {
        System.out.println("晚上睡");
    }
}

定义一个测试类:Test

public class Test {
    public static void main(String[] args) {
        // 创建子类对象  
        Animal a = new Animal();
        // 调用实现后的方法
        a.eat();
        a.sleep();
    }
}
/*
    输出结果:
        吃东西
        晚上睡
*/

子类使用或重写接口中的 默认方法

对于接口中的默认方法,子类可以继承,也可以重写,二选一,但是只能通过实现类的对象来调用。

直接使用默认方法,代码如下:

定义接口:LiveAble

public interface LiveAble {
    public default void fly(){
        System.out.println("天上飞");
    }
}

定义实现类:Animal

public class Animal implements LiveAble {
    // 继承,什么都不用写,直接调用
}

定义测试类:Test<

;