📦 归档笔记 — 原创建于 WizNote,仅作归档展示;观点以当年为准,非最新。

什么是接口

创建时间2019-02-17最后修改2021-12-18原位置/程序员成长之旅/Java学习/笔记/字数1104
目录:程序员成长之旅/Java学习/笔记

语法

//声明一个接口
interface KanJia{
    void seeHouse();//只声明,不做具体的方法,这有点和抽象类 相似.
    void seeBedroom();
}

//调用一个接口
public class KanJiaDog implements KanJia{
    //必须实现(重写)接口所实现的方法  这点和抽象类 相似.
    public void seeHouse(){
        
    }
    
    public void seeBedroom(){
        
    }
}

接口可以规定被继承子类实现一些功能,你可能会有些疑惑,这描述不就是在说抽象类吗?

其实,接口更适合实现一些扩展功能,也就是某些子类独有的功能,没有广泛性的功能,而抽象类相反,是用来规定子类都应该有的功能.

比如狗和猫继承于Animal,所有的动物都会奔跑和吃饭,但是有的狗会看家  有个狗不会, 有的猫会卖萌 有的猫不会,怎么办?难道把他们都写在Animal或者狗或者猫的子类里面吗

下面演示接口以及抽象类混用示例

public abstract class Animal {//在Animal定义所有继承次类的子类都需要实现run 和 eat
    public abstract void run();
    public abstract void eat();
}
public class Dog extends Animal{//定义普通的狗
    @Override
    public void eat() {

    }

    @Override
    public void run() {

    }
}
public class Cat extends  Animal{//定义普通的狗
    @Override
    public void run() {

    }

    @Override
    public void eat() {

    }
}

这个时候我们的业务升级,需要会看家的狗和会卖萌的猫

这个时候  会看家的狗调用看家   会卖萌的猫调用卖萌即可

interface KanJia{ //定义出看家的接口
    void seeHouse();
    void seeBedroom();
}
interface MaiMeng{//定义出卖萌的接口
    void MiaoMiao();
}
public class KanJiaDog extends Animal implements KanJia { //创建出来新的类 会看家的狗 同时继承Animal
    @Override
    public void run() {

    }

    @Override
    public void eat() {

    }

    @Override
    public void seeBedroom() {

    }

    @Override
    public void seeHouse() {

    }
}
public class MaiMengCat extends Animal implements MaiMeng {//创建出会卖萌的猫 同时继承Animal
    @Override
    public void eat() {

    }

    @Override
    public void run() {

    }

    @Override
    public void MiaoMiao() {

    }

}

做一下测试

public class Test  {
    public static void main(String[] args){
        Animal HaShiQi = new KanJiaDog();//我们需要哈士奇作为看家狗 先定义一个Animal类型 向上转型引用KanJiaDog的HaShiQi
        KanJiaDog hashiqi = (KanJiaDog) HaShiQi;//向下转换将hashiqi强制转换为Kanjia狗类型引用KanJiaDog的hashiqi
        hashiqi.seeHouse();//调用hashiqi的看家

    }
}

附录 接口和抽象类的区别

参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造器 接口不能有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有public、protected和default这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

另外, 如果派生类继承的抽象类中实现了某个接口, 那么对于派生类来说, 就是普通的父类方法, 和普通在父类中的具体方法无异, 因为父类中一旦定义实现了接口, 就必须实现接口的具体方法, 另外的, 子类也无需必须实现父类所实现的接口(因为对子类来说那些就是普通的具体方法).

来源: http://www.importnew.com/12399.html