抽象类和接口是定义抽象概念的两种方式,正是由于抽象类和接口,才赋予了Java强大的面向对象的能力。在讨论他们的不同点之前,我们先来了解抽象类和接口。
抽象类
在面向对象的领域一切事物都是对象。对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的。如果一个类中没有包含足够的信息来描绘一个具体的对象,那么这个类就是抽象类。比如说Animal,但是这个Animal具体长成什么样子,我们并不知道,它并没有具体动物的概念,所以是一个抽象类,需要具体的动物,比如猫、狗来对它进行特定的描述,我们才能知道它长什么样子。
抽象类是用来捕捉子类通用特性的。它不能实例化,只能作为子类的超类。
使用抽象类注意点
- 抽象类不能被实例化,由它的子类来实例化,它只需提供一个引用;
- 抽象类可以不包含抽象方法,但是一个类只要包含一个抽象方法,那么这个类必须被声明为抽象类;
- abstract不能与final并列修饰同一个类。
- abstract不能与private、static、final或native并列修饰同一个方法。
接口
接口是一种抽象类型,是抽象方法的集合。实现接口的非抽象类必须要实现该接口的所有方法。
二者区别
- 接口中的方法必须是public(public可以省略),如果在jdk1.8+被static或者default修饰,那么必须提供方法体,否则就是abstract的(abstract可以省略)
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的(public static final可以省略不写或者只写一部分)。
- 接口中不能含有静态代码块,而抽象类是可以有静态代码块。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
继承关系
- 接口可以继承接口,并且是可以继承多个;
- 抽象类不可以继承接口,但可以实现接口,并且可以是多个;
- 抽象类可以继承实体类