1.默认方法与静态方法
java 8中的接口现在支持在声明方法的同时提供实现,通过两种方式可以完成这种操作。
-
Java 8允许在接口内声明静态方法。
-
Java 8引入了一个新功能,叫默认方法,通过默认方法你可以指定接口方法的默认实现。
-
实现接口的子类如果不显式地提供该方法的具体实现,就会自动继承默认的实现。
这种机制可以使你平滑地进行接口的优化和演进。 -
静态方法及接口:
-
同时定义接口以及工具辅助类(companion class)是Java语言常用的一种模式,工具类定义了与接口实例协作的很多静态方法。
-
比如,Collections就是处理Collection对象的辅助类。
-
-
由于静态方法可以存在于接口内部,你代码中的这些辅助类就没有了存在的必要,你可以把这些静态方法转移到接口内部。为了保持后向的兼容性,这些类依然会存在于Java应用程序的接口之中。
-
默认方法
-
接口包含的方法签名在它的实现类中也可以不提供实现
-
缺失的方法实现会作为接口的一部分由实现类继承(所以命名为默认实现),而无需由实现类提供。
默认方法由default修饰符修饰,并像类中声明的其他方法一样包含方法体。2.解决命名冲突规则
如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条规则可以进行判断:
1)类中的方法优先级最高。类或父类中声明的方法的优先级高于任何声明为默认方法的优先级。
2)如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体。
3)最后,如果还是无法判断,继承了多个接口的类必须通过显式覆盖和调用期望的方法,显式地选择使用哪一个默认方法的实现。
##这是一些具备默认方法、静态方法的接口
```java
package com.java.day01;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
interface A1{
int num = 10;
}
abstract class B1{
private String name;
private int age;
}
interface Compute{
public double add(double a,double b);
public static double sqrt1(double num){
return Math.sqrt(num);
}
// //默认方法,含有 default修饰符
public default double sqrt2(double num){
return Math.sqrt(num);
}
}
class ComputeImpl implements Compute{
@Override
public double add(double a, double b) {
return a + b;
}
}
public class InterfaceTest {
public static void main(String[] args) {
Compute c = new ComputeImpl();
System.out.println(c.add(10.5, 5.5));
System.out.println(Compute.sqrt1(4));
System.out.println(c.sqrt2(16));
List<Integer> numbers = Arrays.asList(3,8,2,5,7,1);
numbers.sort(Comparator.naturalOrder());
System.out.println(numbers);
}
}
```