抽象类(抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法)
- 抽象类中可以构造方法
- 抽象类中可以存在普通属性,方法,静态属性和方法。
- 抽象类中可以存在抽象方法。
- 如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
- 抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
接口
- 在接口中只有方法的声明,没有方法体。 (Java8 接口可以有实例方法)
- 在接口中只有常量,因为定义的变量,在编译的时候都会默认加上 public static final (必须被初始化,不能改变)
- 在接口中的方法,永远都被public来修饰(只能)。
- 接口中没有构造方法,也不能实例化接口的对象。
- 接口可以实现多继承实现
- 接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类。
区别:
- 接口中的所有方法都是抽象的,而抽象类中的方法可以被实现
- 接口中的变量只能是private static final (私有静态常量),而抽象类可以包含非final的变量
- 接口中的方法只能被public abstract修饰,而抽象类可以被public protected private 修饰
- 接口中的方法不可以被static修饰
- 类可以实现多个接口,而只能继承一个抽象类
- 接口可以继承接口,但不可以继承类(普通类和抽象类)因为抽象类有可以有方法的实现等等,抽象类都可以继承
- 非抽象类实现一个接口,必须实现它的所有方法,但抽象类的话可以实现一部分。
接口和抽象类的相同点:
- 都可以被继承
- 都不能被实例化
- 都可以包含方法声明
- 派生类必须实现未实现的方法
PS:
- 静态方法不能被重写,不能被抽象
- 本地方法是本地代码实现的方法,不能是抽象
- synchronize与方法的实现细节有关,抽象方法不能被synchronize修饰
- 抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法。而接口中只是对方法的申明和常量的定义。