. 接口的概念
接口也是一种数据类型,比抽象类更加抽象的'类'。
接口是功能的集合,它只描述功能所具备的方法,如何实现这些方法由实现类(子类)通过方法重写来完成。
接口的特点:
A:接口用关键字interface表示
interface 接口名 { // 抽象方法 // 默认方法:JDK1.8 }
B:类实现接口用implements表示
class 类名 implements 接口名 { // 重写抽象方法 }
C:接口不能实例化
注意接口的实例化的方式和抽象方法的是一样的, 那么,接口如何实例化呢?
按照多态的方式来实例化。就是继承的意思
D:接口的子类
a:可以是抽象类。但是意义不大。
b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
由此可见: A:具体类多态(几乎没有) B:抽象类多态(常用) C:接口多态(最常用)
接口成员特点
成员变量:只能是常量,并且是静态的。
默认修饰符:public static final 建议:自己手动给出。
构造方法:接口没有构造方法。
成员方法:只能是抽象方法。 默认修饰符:public abstract 建议:自己手动给出。
接口中的方法
在JDK1.8之后可以有默认的实现(可以有方法体,但是需要使用default关键字修饰),
在JDK1.8之前所有的方法都是抽象方法。
类与类:
继承关系,只能单继承,可以多层继承。
类与接口:
实现关系,可以单实现,也可以多实现。 并且还可以在继承一个类的同时实现多个接口。
接口与接口:
继承关系,可以单继承,也可以多继承。
注意事项
接口可以继承接口,而且可以多继承。
一个类在继承一个类的同时可以实现多个接口,多个接口名之间使用逗号分隔
一个实现类实现接口时需要重写接口接口所有抽象方法,否则该类必须定义为抽象类。
抽象类和接口的区别:
相同点
都不能创建对象
都可以定义抽象方法(JDK1.8之后)都可以定义非抽象方法
A:成员区别
接口中定义成员变量是常量,抽象类中可以定义成员变量和常量。
接口中没有构造方法,抽象类有构造方法
接口可以多继承,类只能单继承。
接口中的成员有默认修饰符
常量:public static final
方法:public abstract
抽象类的成员没有默认修饰符
在JDK1.8之前,接口中只能定义抽象方法,在JDK1.8之后可以定义非抽象方法
抽象类可以定义普通方法和抽象方法
接口中的成员的修饰符是固定,抽象类中的成员的修饰符可以自定义
B:关系区别
类与类 继承,单继承 类与接口 实现,单实现,多实现 接口与接口 继承,单继承,多继承
C:设计理念区别
抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
接口被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。
接口和抽象类的选择
先考虑该功能是否是这种数据类型的共性内容
如果是共性内容,则将该功能定义在父类中。 然后再考虑该功能是否会被所有子类重写如果是,则将该功能(方法)定义为抽象方法,那么该类就定义为抽象类。
如果不是该中数据类型的共性内容,则就应该将该功能定义在接口中,需要拥有该功能的类实现该接口并重写抽象方法即可。
//定义动物培训接口 interface AnimalTrain { public abstract void jump(); } //抽象类实现接口 abstract class Dog implements AnimalTrain { } //具体类实现接口 class Cat implements AnimalTrain { public void jump() { System.out.println("猫可以跳高了"); } } class InterfaceDemo { public static void main(String[] args) { //AnimalTrain是抽象的; 无法实例化 //AnimalTrain at = new AnimalTrain(); //at.jump(); // 这和抽象的方法是一样的 AnimalTrain at = new Cat(); at.jump(); } }