接口(interface)
接口和类是并列的结构
定义接口
- 定义全局常量
static final书写时可以省略不写
-
定义抽象方法
abstract书写时可以省略
-
接口中不能定义构造器
接口不可以实例化
使用
- 接口通过让类来实现(implements)的方式来使用
- 如果实现类覆盖了接口中所有的抽象方法,则此实现类可以实例化
- 如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类
- 接口和抽象是实现,继承是重写
示例
public class Test {
public static void main(String[] args) {
Man man = new Man();
System.out.println(Man.name);
System.out.println(Man.age);
man.show();
}
}
interface Person{
String name = "殷志源";
int age = 42;
void show();
}
class Man implements Person {
@Override
public void show() {
System.out.println("上台表演");
}
}
运行结果
类可以实现多个接口(多实现)
- 弥补了Java类单继承性的局限问题
- 格式:class AA extends BB implements CC,DD,EE{}
- 实现多个接口时,多个接口之间用逗号隔开
- 先写继承再写接口实现
class Woman extends Animal implements Person{
@Override
void eat() {
System.out.println("女孩子喜欢喝奶茶");
}
@Override
public void show() {
System.out.println("女孩子喜欢看爱豆表演");
}
}
注意
1、 接口与接口之间可以继承,而且可以多继承
2、 具体使用体现多态性
3、 接口实际上可以看作是一种规范
接口匿名实现类的对象
- 创建接口的非匿名实现类的非匿名对象
- 创建接口的非匿名实现类的匿名对象
- 创建接口的匿名实现类的非匿名对象
- 创建接口的匿名实现类的匿名对象
新特性(jdk8)
除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
- 静态方法
接口中定义的静态方法只能通过接口调用
-
默认方法
- 通过实现类的对象,可以调用接口中的默认方法
- 如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写后的方法
类优先原则
- 如果实现类(子类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中同名同参数的方法
- 如果实现类实现了多个接口,而多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错(接口冲突)
若还想实现两接口,那么要求必须在实现类中重写此方法