开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
1.接口:
- 抽象类算是半个类,所以用
extends继承抽象类 - 接口完全不是类,所以用
implements实现接口 - 作用:接口是把程序模块进行统一化的模板,是为了降低偶合(抽象类是为了重用)
2.接口中可定义的内容:
-
抽象方法、常量、嵌套类型。
-
从
java8开始可以定义:默认方法、静态方法。 -
上述这些可定义的内容,默认是
public修饰的。(因为接口是提供给别人用的) -
接口中定义的常量可以省略
static、final
public static final int NUM = 10; 等价于 int NUM = 10;
所以接口中是不能定义成员变量的(定义了也会给你变为常量)。
public interface UserInfoDao{
public abstract void select();
//相当于(因为接口中的方法 默认是抽象方法)
void select();
}
3.接口细节:
- 不能定义静态初始化块、构造方法。
- 接口也不能实例化(因为没有构造方法,所以不能通过new来创建)。
- 一个类可通过
implements关键字实现一个或多个接口。 一个接口可以通过extends来继承一个或多个接口(接口可以多继承其他接口) - 实现接口的类必须实现接口中定义的所有抽象方法,除非它是个抽象类。
public abstract class Student implements JiaImpl, BaoImpl{
}
- 若一个类实现的多个接口 中有相同的抽象方法,只需实现此方法一次。
extends和implements一起使用,extends必须写在implements前面。- 当父类、接口中的某个方法签名一样时,那返回值类型也必须一致。
public interface Eatable{
void eat(String name);
}
public class Animal{
public int eat(String name){
return name.length();
}
}
public calss Dog extends Animal implements Eatable{
//会报错,接口和父类 的此方法 返回值不一致
public void eat(String name){
}
}
4.抽象类与接口对比:
-
使用抽象类叫继承,使用接口叫实现。
继承:A extends B, A 是 B 实现:A implements B, A 会 B 中的行为 -
接口为了降低耦合,抽象类为了重用。
-
构造方法:抽象类可有构造方法,接口不能有。
5.何时选择抽象类?
- 在紧密相关的类之间共享代码。(A,B 类之间有共同代码 D,可把 D 弄到抽象类中)
- 需要除
public之外的访问权限。 - 需要定义实例变量,非
final的静态变量。
6.何时选择接口?
- 不相关的类实现相同的方法。
- 只是定义行为,不关心具体是谁实现了行为。
- 想实现类型的多重继承。
7.默认方法:Default Method
-
用
default修饰的方法 -
默认方法只能是实例方法
-
默认方法不需要实现,直接可调用或重写。
-
若一个类 父类定义的非抽象方法与接口的默认方法相同时,最终调用父类的方法。
// 父类 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{ } -
若一个类 父类定义的抽象方法与接口的默认方法相同时,要求子类实现此抽象方法。
public interface Eatable{ public default void eat(String name){ print("eat:" + name); } }