4-接口
1.接口:
- 抽象类算是半个类,所以用 extends 继承抽象类
- 接口完全不是类,所以用 implements 实现接口
- 作用:接口是把程序模块进行统一化的契约,是为了降低偶合(抽象类是为了重用)
2.接口中可定义的内容:
抽象方法、常量、嵌套类型。
从 java8 开始可以定义:默认方法、静态方法。
上述这些可定义的内容,默认是 public 修饰的。(因为接口是提供给别人用的)
接口中定义的常量可以省略 static、final
1 | public static final int AGE = 10; 等价于 int AGE = 10; |
1 | public interface UserDao{ |
3.接口细节:
不能定义静态初始化块、构造方法。
接口也不能实例化(因为没有构造方法,所以不能通过new来创建)。
一个类可通过 implements 关键字实现一个或多个接口。
一个接口可以通过 extends 来继承一个或多个接口(接口可以多继承其他接口)实现接口的类必须实现接口中定义的所有抽象方法,除非它是个抽象类。
1
2
3public abstract class Student implements JiaImpl, BaoImpl{
}若一个类实现的多个接口 中有相同的抽象方法,只需实现此方法一次。
extends 和 implements 一起使用,extends 必须写在 implements 前面。
当父类、接口中的某个方法签名一样时,那返回值类型也必须一致。
1 | public interface Eatable{ |
4.抽象类与接口对比:
使用抽象类叫继承,使用接口叫实现。
1
2继承:A extends B, A 是 B
实现:A implements B, A 会 B 中的行为接口为了降低耦合,抽象类为了重用。
构造方法:抽象类可有构造方法,接口不能有。
5.何时选择抽象类?
- 在紧密相关的类之间共享代码。(A,B 类之间有共同代码 D,可把 D 弄到抽象类中)
- 需要除 public 之外的访问权限。
- 需要定义实例变量,非 final 的静态变量。
6.何时选择接口?
- 不相关的类实现相同的方法。
- 只是定义行为,不关心具体是谁实现了行为。
- 想实现类型的多重继承。
7.默认方法:Default Method
用 default 修饰的方法
默认方法只能是实例方法
默认方法不需要实现,直接可调用或重写。
若一个类 父类定义的非抽象方法与接口的默认方法相同时,最终调用父类的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// 父类
public class Animal{
public void run(){
System.out.println("Animal - run");
}
}
// 接口
public interface Runnable{
public default void run(){
System.out.println("Runnable - run");
}
}
// 调用
public calss Dog extends Animal implements Runnable{
}若一个类 父类定义的抽象方法与接口的默认方法相同时,要求子类实现此抽象方法。
1
2
3
4
5public interface Eatable{
public default void eat(String name){
print("eat:" + name);
}
}