1.接口和抽象类区别:
(1)实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
(2)构造函数:抽象类可以有构造函数;接口不能有。
(3)实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
(4)访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
2.接口抽象类相同点
(1)都是抽象类,都不能实例化。
(2)interface实现类以及abstract class的子类都必须要实现已经声明的抽象方法。
3.接口的使用场景
(1)类与类之前需要特定的接口进行协调,而不在乎其如何实现。
(2)作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
(3)需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
(4)需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。
注意:接口中的成员变量必须是public static final?
(1)接口是一种高度抽象的"模版",而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public static的 ,是所有实现类共有的 .。
(2)假如可以是非static的话,因一个类可以实现多个接口,出现重名的变量,无法区分。
(3)接口中如果可能定义非final的变量的话,而方法又都是abstract的,这就自相矛盾了,有可变成员变量但对应的方法却无法操作这些变量,虽然可以直接修改这些静态成员变量的值,但所有实现类对应的值都被修改了,这跟抽象类有何区别? 又接口是一种更高层面的抽象,是一种规范、功能定义的声明,所有可变的东西都应该归属到实现类中,这样接口才能起到标准化、规范化的作用。所以接口中的属性必然是final的。
(4)在interface里面的变量默认都是public static final 的。所以可以直接省略修饰符:
以下定义方式均正确:
static final int x= 1;
final int x= 1;
int x= 1;
4.抽象类的使用场景
在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。
例如:
(1)定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
(2)某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
(4)规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能
注意:
抽象类中不一定包含抽象方法,但是包含抽象方法的类一定要被声明为抽象类。抽象类本身不具备实际的功能,只能用于派生其子类。抽象类中可以包含构造方法,但是构造方法不能被声明为抽象。