Java8中接口可以拥有方法体,添加方法体时需要用default或static修饰方法;同等的,如果在接口中用default或static对方法进行修饰,该方法必须有方法体。static可以直接调用,但default是添加一个默认的方法实现,需要通过对象调用。

至此接口和抽象类越来越相像。总结一下增加新特性后接口和抽象类的异同点。

1.接口和抽象类都可以定义方法和属性,方法都可以拥有方法体,但接口中的有方法体的方法需要用static或default修饰【Java8新特性,default只能用于修饰接口中的方法】,并且接口中方法只可以是public的,抽象类中的抽象方法可以为protected和public,具体方法权限不限;接口中定义的属性只能是常量,并且是静态的。默认修饰符:public static final。

2.抽象类中可以含有静态代码块和静态方法,而接口不能含有静态代码块【Java8后可以含有静态方法,必须有方法体】。

3.抽象类中有构造方法,用于子类访问父类数据的初始化;接口没有构造方法。

4.接口和抽象类都是特殊的类,不能直接被实例化,但都可以通过多态的形式通过子类来进行具体实现。

5.接口可以继承接口,可单继承,也可多继承;抽象类只能单继承。

6.接口只能继承接口;抽象类可以继承抽象类也可以继承普通类。

7.设计理念上,抽象类被继承体现的是"is a"的关系即表示的是子类“是不是”属于某一类的子类,定义的是该继承体系的共性功能,例如猫和狗还有鸟都是一种动物,拥有相同共性,都继承自动物类;接口被实现体现的是"like a"的关系即表示像一个,代表组合关系,“有没有”特性“能不能”做这种事,定义的是该继承体系的扩展功能,例如无人机和鸟都能在空中飞行,两者都有fly()方法,但是两者共性并不多,不应该继承同一个抽象类,而是实现接口。

8. 继承抽象类或者实现接口的子类必须实现抽象类或接口的所有抽象方法,若没有实现所有抽象方法,则该类需要定义为抽象类。