接口就是一种规范或标准,只要符合这个标准都可以通用,接口的表现

在于对行为的抽象。 就好比插座,每个厂商生产的插座我们都可以用,这是因为他们有同一个标准,这里插座就是接口。

image-20240802144332450

//接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口
 
public interface 接口名称{
// 定义变量
int a = 10;      // 接口当中的成员变量默认都是public static final
 
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
void method2();  //  接口当中的成员方法默认都是public abstract, 更推荐用第二种来定义方法 
}

接口中包含抽象方法,所以不能实例化接口,要实现接口徐一个普通类。接口和类之间用关键字implement实现一个类实现某个接口则必须实现该接口中的抽象方法,否则该类必须被定义为抽象类

🌰接口中可以包含变量和方法,变量被隐式指定为 public static final,方法被隐式指定为 public abstract(JDK 1.8 d一个类可以同时实现多个接口,一个类实现某个接口则必须实现该接口中的抽象方法,否则该类必须被定义为抽象类
🌰接口支持多继承,即一个接口可以继承(extends)多个接口,间接解决了 Java 中类不能多继承的问题。

接口用法
  • 一般情况下,实现类和它的抽象类之前具有 "is-a" 的关系,但是如果我们想达到同样的目的,但是又不存在这种关系时,使用接口。
  • 由于 Java 中单继承的特性,导致一个类只能继承一个类,但是可以实现一个或多个接口,此时可以使用接口。

接口帮Java实现多继承

由于 Java 中单继承的特性,导致一个类只能继承一个类,但是可以实现一个或多个接口,此时可以使用接口。
class Animal {
    String name;        // 不能使用private,后面的子类也要用
 
    public Animal(String name) { // 父类的自定义的构造方法
        this.name = name;
    }
}
interface IFlying {   // 自定义多种接口
    void fly();
}
interface IRunning {
    void run();
}
interface ISwimming {
    void swimming();
}
// 小鸭子,不仅会跑,还会游泳、飞行
一个类继承父类,并实现多个接口,间接的解决java中不能多继承的问题
class Duck extends Animal implements IRunning, ISwimming, IFlying {
 
    public Duck(String name) {  // 子类构造方法
        super(name);            // 必须在子类构造方法的第一行
        // 在给实现子类的构造方法前,先要用super()调用实现父类的构造方法,比较先有父后有子呀!
        // 因为父类自己定义了构造方法,编译器不会自动给给子类构造方法中添加super();来实现父类的构造方法,需要我们自己实现
    }
    // 对接口中的抽象方法进行重写
    @Override
    public void fly() {
        System.out.println(this.name + "正在用翅膀飞");
    }
 
    @Override
    public void run() {
        System.out.println(this.name + "正在用两条腿跑");
    }
 
    @Override
    public void swimming() {
        System.out.println(this.name + "正在漂在水上");
    }
 
}
 
public class 接口的使用 {  // 不用学我用中文名作为类名,我只是为演示方便
    public static void main(String[] args) {
        Duck duck = new Duck("第一个小鸭子");  // 实例化鸭子对象
        duck.fly();  // 通过引用 变量名.方法名 输出重写后的方法
        duck.run();
        duck.swimming();
    }
}
有人可能会说干嘛用接口,我直接在父类Animal中实现fly、run、swimming这些属性,
然后不同的动物子类再继承父类这些方法不行吗?
 
但问题是,鸭子会fly、swimming,那猫会飞和游泳吗?你再写个其他动物的子类是不是就不行了
而用接口呢?我们只是把这种飞、游泳的行为给抽象出来了,
 
只要一个子类有这种行为,他就可以实现相对应的接口,接口是更加灵活的

运行结果
一个小鸭子正在用翅膀飞
一个小鸭子正在用两条腿
一个小鸭子正在水上漂
 

一个类继承一个父类, 同时实现多个接口。

继承表达的含义是 is - a 语义, 而接口表达的含义是 具有 xxx 特性 ,能实现接口的类和该接口并不一定有is_a的关系,只要该类有这个接口的特性就行

public interface Dog {
public abstract void eat();//public abstract可以省略不写
}

  1. 接口可以用来对类提供标准或规范(避免类在设计上的不一致性)
  2. 接口可用于简介实现多重继承(使用接口为实现类添加额外功能)
  3. 接口可以是设计与现实相分离(降低代码耦合度,保证代码安全性)