区别一: 抽象类中可以存在非抽象的方法 VS 接口中的方法被默认的变成抽象方法,只要是定义了接口,接口中的方法 就全部变成了抽象类即使你不写 abstract 它也是抽象的方法
区别二: 实现抽象类的方法时, 如果方法是抽象的,子类必须重写抽象的方法. 如果方法不是抽象的, 子类可以选择继承 VS 实现了接口 就必须实现接口中的所有方法, 因为接口中的方法默认的全部都是抽象的方法 --------------所以这里可以说, 接口是抽象类的一种, 也可以说接口是抽象类的延伸
区别三: 抽象类可以有私有的成员变量和成员方法 VS 接口中的方法全都被默认的修饰为: public abstract 类型的方法
区别四: 一个类只能继承一个抽象类 VS 一个类可以实现多个接口 ,接口可以实现多继承 举例:interface display extends aa ,bb,cc ...等等 然后让类去实现 display的接口 就可以实现 display aa bb cc接口
区别五: 抽象类中的非抽象的方法可以选择继承 VS 接口中的方法必须全部被重写 ,并且全部是公有的public 方法.
注:java8中接口已经可以用default来修饰方法来实现方法而非只能申明方法,java9中接口有static方法了,未来版本可能抽象类和接口间用来编程使用时的差距可能越来越小。所以之间的区别还需从设计理念上来理解。抽象类是面向对象编程中为了简化复用代码而产生的,它是把类抽象出公共属性和行为。接口是一种编程思想,它是抽象行为形成一种规范。
设计理念的差异
1、抽象类与接口的抽象层次是不同的
抽象类是对类抽象,接口是对行为抽象。类包含了属性与行为,所以说接口是更具体的抽象。
设计层面看,抽象类是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为规范。
2、抽象类与接口的设计层次是不同的
抽象类是一种自下而上的设计,先有子类才能提取公同的属性与行为,抽象出父类;
接口是一种自上而下的设计,先规定行为方法,只要可以实现这些行为,就可以成为接口的实现类。
3、抽象类与其派生类的关系和接口与其实现类的关系本质是不同的
抽象类与其派生类是一种“is-a”关系,即父类和派生子类在概念上的本质是相同的(父子关系,血缘联系,很亲密)。
接口与其实现类是一种“like-a”关系,即接口与实现类的关系只是实现了定义的行为,并无本质上的联系(契约关系,很淡漠的利益关系)。
举个例子:比如说一个动物抽象类,定义了跑的方法、叫的方法,但如果一个汽车类可以实现跑、可以实现叫,它就可以继承动物抽象类吗?!这太不合理了,汽车不是动物呀!而如果通过接口定义跑的方法、叫的方法,汽车类作为实现类实现跑和叫,完全OK很合理,就因为没有继承关系的约束。
批注: ISP(Interface Segregation Principle):面向对象的一个核心原则。它表明使用多个专门的接口比使用单一的总接口要好。
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。