相似:
接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。
接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
区别:
抽象类中可以存在非抽象的方法;接口中的方法默认全是抽象方法,不能存在非抽象方法。
抽象类里则既可以定义普通成员变量,也可以定义静态常量;接口中只能定义定义静态常量。
抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作;接口不能包含构造器
抽象类里可以包含初始化代码块;接口里不能包含初始化代码块。
实现抽象类的方法时, 如果方法是抽象的,子类必须重写抽象的方法.
如果方法不是抽象的, 子类可以选择继承;实现接口必须实现接口中的所有方法。一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承不足。