接口

131 阅读3分钟

1. 接口的由来

  • 定义抽象类

  • 把抽象类中,所有的属性,所有构造方法,所有成员方法删除

    • 只剩下抽象方法
  • 把定义抽象类的 abstract class 修改为 interface

    • 此时这个类就不再成为抽象类,而是称为接口
  • 把抽象类子类继承父类的关键字extends修改为implements

package com.qfedu;
​
public class Demo01 {
​
    public static void main(String[] args) {
        Animal a = new Duck();
        a.eat();
    }
}
​
interface Animal {
    
    public abstract void call();
    
    public abstract void eat();
}
​
class Duck implements Animal{
​
    @Override
    public void call() {
        System.out.println("嘎嘎嘎---");
    }
​
    @Override
    public void eat() {
        System.out.println("鸭子,到河里逮鱼吃");
    }
    
}

2. 接口的定义


public interface 接口名 {
​
    //抽象方法
}
  • 接口不能属性,成员方法,构造方法

  • 接口可以定义抽象方法

    • 抽象方法的使用范围修饰符必须是public
    • 定义抽象方法,可以不定义public abstract,默认就是由public abstract修饰
  • 接口可以定义公开的静态常量

    • 可以忽略掉public static final,定义一个变量,默认的修饰符就是public static final

由于接口中定义的都是抽象方法,想要使用该方法,必须为接口定义实现类

  • 使用implements关键字,表示一个类对接口的实现
  • 实现类必须实现接口中所有的抽象法

publicimplements接口名 {
    //实现接口中所有的抽象方法(也可以理解为子类重写父类的方法)
}

package com.qfedu;
​
public class Demo02 {
​
    public static void main(String[] args) {
        //接口(父类)的引用,指向到实现类(子类)的对象
        A a1 = new B();
        a1.m1();
        
        A a2 = new C();
        a2.m1();
        
        /*
         * 接口的引用,指向到不同实现类的对象,执行接口中的方法,也会产生多态
         */
        
        /*
         * 1. 定义接口 X,有两个抽象方法 m1(),m2()
         * 2. 定义类Y,W实现接口X
         * 3. 定义两个变量,数据类型为X,分别指向Y,W对象,然后执行m2()方法
         * 
         */
        
    }
}
​
interface A {
    
    void m1();
    
}
​
class B implements A {
​
    @Override
    public void m1() {
        System.out.println("B 实现 m1"); 
    }
​
}
​
class C implements A {
​
    @Override
    public void m1() {
        System.out.println("C 实现 m1"); 
    }
​
}

3. 接口的特点

在java中类是单继承的,一个类一旦继承一个类,就不能再表示其他类型的事物。

但是在现实中,一个对象拥有多种身份是很正常的。

思考:你咋就成为了英雄呢?

  • 和属性没有关系
  • 和行为有关系,是你做到这些事情,你就是一个英雄

特点:

  • 一个类实现多个接口,解决我们不能多继承的问题
  • 接口可以多继承,一个接口可以继承多个接口

package com.qfedu;
​
public class Demo04 {
​
}
​
interface Hero {
    
    //救人
    void rescuePerson();
    
    //挽救财产
    void savingProperty();
    
}
​
interface QfStudent {
    
    void studyCoding();
    
}
​
/*
 * 一个类实现多个接口,解决我们不能多继承的问题
 */
class QfHero implements Hero, QfStudent {
​
    @Override
    public void studyCoding() {
        System.out.println("起早贪黑写代码----");
    }
​
    @Override
    public void rescuePerson() {
        System.out.println("放开他,让我来----");
    }
​
    @Override
    public void savingProperty() {
        System.out.println("把你们的手机,钱包都给我,我跑的快----");
    }
    
}
​
​
interface Teacher {
    
    //教授知识
    void teach();
}
​
interface Chef {
    
    //做菜
    void cooking();
}
​
/*
 * 接口可以多继承
 */
interface XDFTeacher extends Teacher, Chef {
    
}
​
​
class XDFTeacherImpl implements XDFTeacher {
​
    @Override
    public void teach() {
        
    }
​
    @Override
    public void cooking() {
        
    }
    
}