1、如果要创建不带任何方法和成员变量的基类,应该选择接口而不是抽象类。
2、接口可以实现多继承。
3、接口和抽象类的区别与联系:
1)接口和抽象类都不能实例化,若要被实例化,要有子类继承抽象类且实现抽象类中的所有方法,再利用多态——父类引用指向子类对象实现实例化;接口变量必须指向实现接口所有方法的类对象。
2)抽象类中定义的方法不一定是抽象方法,但是接口中定义的方法都是抽象方法。
3)抽象类可以被继承extends,子类要实现抽象类中定义的所有方法,否则子类将无法被实例化,如果子类没有实现全部父类抽象方法,那么子类只能是抽象类;接口可以被实现implements,同样接口中定义的方法也都要被实现,这就体现了专用接口优于单一接口,专用接口避免了所有方法在同一接口中,有些类不能实现。
4)抽象方法只能声明,不能实现,但是抽象方法是要被子类实现的,派生类必须覆盖基类中的抽象方法,因此抽象方法不能是静态的,也不能是私有的。例如:
abstract function fun1();
abstract function fun2();
5)接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
6)接口只能做方法声明,抽象类中可以做方法声明,也可以做方法实现。
7)当关注一个事物本质的时候,用抽象类;当关注一个操作的时候,用接口。例如:抽象类表示的是这个对象是什么。接口表示的是这个对象能做什么。比如,男人,女人,这两个类,他们的抽象类是人。人可以吃东西,狗也可以吃东西,可以把“吃东西”定义成一个接口,然后让这些类去实现它。
8)接口可继承接口,并可以多继承接口,并且类可以实现多个接口,但类只能单根继承。
4、接口的实现方法必须是public的原因:
首先,接口的默认方法都是public类型的,如果不是public类型的,那么这个接口只能在同包的类中实现,其访问权限就降低了很多,而且实现类相当于子类,子类的访问权限不能小于父类,因此实现类的方法必须用public类型的。