1. abstract(抽象 )
抽象用来描述一类对象,而不是一个确切的对象。
- 语法
abstract class Foo { // 合法,abstract类可以不包含abstract方法
}
class Foo1 {
abstract void bar(); // 非法,包含abstract方法一定是abstract类
abstract void bar1() {} // 非法,abstract方法不能有实现
}
public class Main {
public static void main(String[] args) {
new Foo(); // 非法,不能实例化abstract类
}
}
2. interface(接口)
比abstract class更加抽象,是一种特殊的abstract class,抽象程度比abstract class更高。
- 特点:
-
接口中的成员变量默认都是public、static、final类型的,必须被显示初始化。
-
接口中的方法默认都是public、abstract类型的。
-
接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法。
-
接口没有构造方法,不能被实例化。
-
一个接口不能实现另一个接口,但它可以继承多个其他接口。
-
接口必须通过类来实现它的抽象方法。
-
与子类继承抽象父类相似,当类实现了某个接口时,它必须实现接口中所有的抽象方法,否则这个类必须被定义为抽象类。
-
一个类只能继承一个直接的父类,但能实现多个接口。
-
3. 两者的区别
- 抽象类可以提供成员方法的实现,而接口不行(在java8中使用default可以定义一个默认实现)
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法
- 类只能继承一个抽象类,而一个类却可以实现多个接口
- 抽象类中的方法子类必须全部实现,不然子类也是抽象类,而接口中的抽象方法子类必须全部实现,是可选择实现的
- 抽象类是一种模板设计模式,而接口是一种行为规范。
default关键字定义默认方法实现可能出现的问题
- 两个interface定义了相同的方法
interface A { default void show() { System.out.println("A show"); } } interface B { default void show() { System.out.println("B show"); } } class Scratch implements A, B { // 报错, Error:(13, 1) 类 Scratch从类型 A 和 B 中继承了show() 的不相关默认值 public static void main(String[] args) { new Scratch().show(); } }
报错,提示
Error:(13, 1) 类 Scratch从类型 A 和 B 中继承了show() 的不相关默认值
- 一个class一个interface中定义了相同的方法
interface A { default void show() { System.out.println("A show"); } } class Scratch implements A { public void show() { System.out.println("Scratch show"); } public static void main(String[] args) { new Scratch().show(); } }
合法:class中的方法拥有更高的优先级,将会覆盖interface中的同名方法,输出
Scratch show
网友评论