概念:
接口是对类的一组需求描述,这些类需要遵从接口描述的统一格式进行定义
个人理解:
接口是由全局常量和公共抽象方法所组成的,接口是解决java无法使用多继承的手段,接口的实际作用是制定标准.接口就是描述一种能力,而类则必须实现这种能力.接口更像是定义一种规范,方便理解代码
注意事项:
- 接口不能实例化,接口中不能有构造。
- 接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
- 接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。
- 接口中的方法会自动使用public修饰,数据会自动使用public static final修饰
- 接口关键字interface,接口实现类的关键字implements
- 接口可以包含静态方法(java SE8)
抽象类和接口
相同之处
- 接口和抽象类都不能被实例化
- 都位于顶端,用于被其他的类实现和继承
- 都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
不同之处
- 接口只包含抽象方法、静态方法和默认方法,不能为普通方法提供方法实现;抽象类完全包含普通方法
- 接口只能定义静态常量,不能定义普通成员变量;抽象类既可以定义普通成员变量,也可以定义静态常量
- 接口不能包含构造器;抽象类可以包含构造器(让抽象类的子类调用这些构造器来完成属于抽象类的初始化操作)
- 接口不能包含初始化块;抽象类可以包含初始代码块
- 接口可以被多实现;继承只能单继承(包括抽象类)
个人理解:接口是对动作的抽象,抽象类则是对本质的抽象;抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。
默认方法冲突:
1、类中的方法优先级最高,类和父类中声明的方法优先级高于接口;
2、类中无任何声明,子接口的优先级更高,高于任何声明为默认方法的优先级;
3、以上不满足,继承了多接口的类必须通过显示覆盖和调用期望的方法,显式的选择哪种默认方法;
//: 测试接口默认方法的冲突
interface a{
default String getName() {
return getClass().getName() + "_" + hashCode() + " Named";
}
}
interface b{
default String getName() {
return getClass().getName() + "_" + hashCode() + " Base";
}
}
public class Test implements a, b{
//覆盖getName方法
public String getName() {
return Named.super.getName();
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.getName());
}
}
上面如果test类不覆盖getname方法,编译器会报错.
//: 测试接口默认方法的冲突
interface a{
default String getName() {
return getClass().getName() + "_" + hashCode() + " a";
}
}
class b{
default String getName() {
return getClass().getName() + "_" + hashCode() + " b";
}
}
public class Test extends b implements a{
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.getName());
}
}
上面在这种情况下,只会考虑超类方法,接口的所有默认方法都会被忽略.这正是”类优先”原则.