(1): 成员区别
抽象类:
成员变量: 可以是变量也可以是常量
构造方法: 有构造方法
成员方法: 可以是抽象方法(修饰符可以是public ,protected和默认类型),也可以是非抽象方法,所有的抽象方法必须全部重写
静态方法: 可以有
接口:
成员变量: 只能是常量 ,存在默认的修饰符: public static final
构造方法: 没有构造方法
成员方法: 只能是抽象方法(修饰符只能是public并且默认是public abstract), 存在默认的修饰符: public abstract,抽象字类需要重写接口中的抽象方法
静态方法: 不能有(static方法是类方法,它是不允许子类覆写(override)而abstract方法是没有实现的方法,是必须由子类来覆写的。能这么设就矛盾了)
(2): 关系区别:
类与类: 继承关系, 只能是单继承 , 不能是多继承,但是可以是多层继承
类与接口: 实现关系, 可以是单实现,也可以是多实现,并且一个类可以继承一个类的同时去实现多个接口
接口与接口: 继承关系 可以是单继承也可以是多继承
相同点:
两者都是抽象类,都不能实例化。
interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。
(3): 设计理念
抽象类 体现的关系"is a" 抽象类中定义的是该继承体系的共性功能。
接口 体现的关系"like a" 接口中定义的是该继承体系的扩展功能。
(4): 使用场景
接口:需要实现特定的多项功能,而这些功能之间可能完全没有任何联系
如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
如果你想实现多重继承,那么你必须使用接口。
由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
抽象类表示共有许要实现的方法 接口用来特定类有需要才实现 人都会吃饭 但有的人抽烟
抽象类是用来捕捉子类的通用特性的
抽象类是 is a关系;而接口是has a关系
看看jdk的api会发现大部分接口都是able结尾的,表示一种能力。马士兵曰过:当你不知道用抽象类还是接口好时就用接口