接口和抽象类的区别是什么?
从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
延伸问题:接口和抽象类应该考虑分别在什么时候使用?
抽象类
1. 你想要在几个关联紧密的类之间共享代码。
2. 你想要继承抽象类的那些类有一些公共方法或属性或是有修改protected或private属性的权限。这时你也可以考虑使用抽象类。
3. 你想要声明非静态或者是非最终执行的属性。你可以获得并且修改这些属性所属的对象的状态。
接口
1. 用相互之间无关的类实现你的接口。举例来说,可比较的和可克隆的那些接口可以使用无关的类来实现。
2. 你想指定一个特定数据类型的行为,但是不用去关心由谁来实现这一行为。
3. 你想要利用多继承的优势。