- 抽象类可以存在普通成员函数,而接口中只能存在public abstract方法
- 抽象类中的成员比变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
- 抽象类只能继承一个,接口可以实现多个
接口和抽象类的设计目的是不一样的。
- 接口的设计目的是对类行为进行约束。规定类能够做什么。但是只约束了行为的有无,不管具体是怎么实现的。
- 抽象类的设计目的是为了代码复用,不同的类具有一些相同的行为,并且一部分行为是一样的。可以让这些类提取出一些共同的行为。
比如:
对于狗和猫都要会叫,但是他们叫的声音不同(“汪汪”,“喵”)这时候我们想去规定动物都要会叫,就使用接口。
而对于大黄狗和柯基,他们的叫声相同(“汪汪”)但是他们跑的不一样。我们想对代码进行优化,就可以使用到抽象类。对于“叫”这个行为就可以定义在抽象类里面。可以实现代码的复用。而对于“跑”行为使用抽象方法来定义,让其子类自己定义狗具体是怎样“跑”的。
抽象类是对类本质的抽象。包含并实现子类通用特性。将子类存在差异化的特性进行抽象,交给子类去实现。
接口是为行为的抽象,接口的核心是定义行为,即实现类可以做什么。至于实现类主体是谁,是如何实现的,接口并不关注。
当你关注一个事物的本质的时候,用抽象类,当你关注一个操作的时候,用接口。
抽象类的功能超过接口,但是定义抽象类的代价高,因为每个类只能继承一个类。在这个类中必须继承或编写出其子类的所有共性。
虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。