一、接口的特性
1.1 接口不是类,不能使用new运算符实例化一个接口;
1.2 接口中的方法不能包含实例域或静态方法,但却可以包含常量
接口中的方法都会自动地被设置为public,接口中的域将会自动设定为public static final。
Java 语言规范建议不要书写多余的关键字。也就是说,在接口中不要多余地为方法添加public关键字,为域添加 public static final 关键字。
1.3 每个类只能拥有一个超类,但却可以实现多个接口;
二、接口与抽象类
2.1 接口和抽象类都能表示通用的属性;
2.2 但是如果使用抽象类来承载通用的属性,那么每个类都只能拓展于一个类。
有些程序语言中允许一个类有多个超类(即,多重继承)。但Java中不支持多重继承,因为多重继承会让语言本身变得复杂(如C++),效率也会降低。
2.3 接口可以提供多重继承的大多数好处,同时又能避免多重继承的复杂性和低效性
三、静态方法
在Java SE8中,允许接口定义静态方法。(没有理由认为这不合理,只是有违于将接口作为抽象规范的初衷)
在接口中允许定义静态方法之前,通常将静态方法放在伴随类中。在标准库中,可以看到接口和实用工具类成对出现,如Collection/Collections 或 Path/Paths。
可以定义静态方法之后,就不再需要为实用工具方法提供一个伴随类。
四、默认方法
可以为接口定义一个默认方法,必须用default修饰符标记。接口中的默认方法可以调用任何其他方法。
在接口中定义的默认方法,在实现这个接口的时候,可以选择是否实现这个方法。这样的好处是可以让程序员有选择性的去实现。
默认方法的一个重要用法是“接口演化”。
五、接口默认方法的冲突
java中解决这种冲突的规则如下:
1) 超类优先(“类优先”)。如果超类中提供了一个具体方法,同名而且有相同参数类型的默认方法会被忽略。
2)接口冲突。如果一个超接口提供了一个具体方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同方法,必须覆盖这个方法来解决冲突。
如 class Student implements Person, Named{ public String getName(){return Person.super.getName();}}
1527

被折叠的 条评论
为什么被折叠?



