java接口

144 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天 @TOC

一、初始接口

1.1 什么是接口?

接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。 在这里插入图片描述

1.2 接口定义规则

Interface关键字用来声明一个接口。

interface 接口名称 {
        // 声明变量
        // 抽象方法
}

代码如下(示例):

interface IInterface {
    //任何类型为 public static final 字段
    //任何类型位 public abstract 方法
}

1.接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。 2.接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。 3.接口中的方法都是公有的。 4.接口中的方法和属性不要加任何修饰符号,保持代码简洁性.

二、接口的使用

接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。 定义一个Animal接口:

//定义Animal接口
interface Animal {
    void eat();
}

子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。

class Dog implements Animal {

    @Override
    public void eat() {
        System.out.println("吃狗粮!");
    }
}
class Cat implements Animal {

    @Override
    public void eat() {
        System.out.println("吃猫粮!");
    }
}

测试一下接口是否支持多态:

public static void func(Animal animal) {
        animal.eat();
    }
    public static void main(String[] args) {
        func(new Dog());
        func(new Cat());
    }

在这里插入图片描述

二、接口的特性

1.接口类型是一种引用类型,但是不能直接new接口的对象

public static void main(String[] args) {
        Animal animal = new Animal();
    }

在这里插入图片描述 2.接口中的每一个方法都是隐式指定为public abstract,如果设定为其他修饰符都会报错

interface IInterface {
    protected void func();
}

在这里插入图片描述 3.接口中的方法不能有具体的实现

interface Animal {
    void eat(){
        System.out.println("吃饭!");
    }
}

在这里插入图片描述 4.重写接口方法时只能使用public访问限权修饰

class Dog implements Animal {

    @Override
     void eat() {
        System.out.println("吃狗粮!");
    }
}

在这里插入图片描述 5.接口中的变量默认为public static final变量

interface Animal {
    int age = 18;
    void eat();
}
public static void main(String[] args) {
        System.out.println(Animal.age);//可以用接口名访问,证明是静态的
        Animal.age = 20;//无法修改,说明被final修饰
    }

在这里插入图片描述 6.接口中不能有静态代码块和构造方法 在这里插入图片描述 在这里插入图片描述7.接口虽然不是类,但是在编译后生成的字节码文件后缀也是.class 在这里插入图片描述 8.如何一个类没有实现接口中的所有抽象方法,该类必须设置为抽象类. 在这里插入图片描述 在这里插入图片描述 9.JDK1.8中,接口中可以包含default方法. 在这里插入图片描述 10.接口间的继承 在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。 接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字.

interface IRunning {
    void running();
}
interface ISwimming {
    void swimming();
}
//两栖动物,既有跑,又有游的功能
interface IAmphibious extends IRunning,ISwimming {
    
}

接口间的继承相当于把多个接口合并在一起.

三、实现多接口

java中,不支持多继承,但一个类可以实现多个接口.

//定义一个Animal类
class Animal {
    public String name;
    
    public Animal(String name) {
        this.name = name;
    }
}
//定义一组会飞的,会跑的,会游泳的接口
interface IFlying {
    void fly();
}
interface IRunning {
    void run();
}
interface ISwimming {
    void swim();
}

我们创建几个具体的动物

class Cat extends Animal implements IRunning {
    //猫是会跑的
    public Cat(String name) {
        super(name);
    }
    @Override
    public void run() {
        System.out.println(this.name+"正在跑");
    }
}
class Fish extends Animal implements ISwimming {
    //鱼会游泳
    public Fish(String name) {
        super(name);
    }
    @Override
    public void swim() {
        System.out.println(this.name+"正在游");
    }
}
``

```java
class Frog extends Animal implements IRunning,ISwimming {
    //青蛙会跑也会游

    public Frog(String name) {
        super(name);
    }
    @Override
    public void run() {
        System.out.println(name+"正在跑");
    }

    @Override
    public void swim() {
        System.out.println(name+"正在游");
    }
}

注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。 有了接口之后, 类的使用者就不必关注具体类型,而只关注某个类是否具备某种能力.

//我们实现一个方法,我们不用管到底是什么动物,只要会跑就可以调用.
public static void run(IRunning iRunning) {
        iRunning.run();
    }
//这里我们写一个机器人类
class Robot implements IRunning {
    public String name;
    public Robot(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name + "正在跑");
    }
}
 public static void main(String[] args) {
        run(new Cat("喵喵"));
        run(new Robot("机器人"));
    }

在这里插入图片描述 在这里我们不用管是不是动物,只要具有这个功能即可调用.