public interface JDK8Interface1 {
//1.接口中可以定义静态方法了
public static void staticMethod(){
System.out.println("接口中的静态方法");
}
//2.使用default之后就可以定义普通方法的方法体了
public default void defaultMethod(){
System.out.println("接口中的默认方法");
}
}
public interface JDK8Interface2 {
//接口中可以定义静态方法了
public static void staticMethod(){
System.out.println("接口中的静态方法");
}
//使用default之后就可以定义普通方法的方法体了
public default void defaultMethod(){
System.out.println("接口中的默认方法");
}
public class JDK8InterfaceImpl2 implements JDK8Interface1,JDK8Interface2 {
//实现接口后,默认方法名相同,必须复写默认方法
@Override
public void defaultMethod() {
//接口的
JDK8Interface1.super.defaultMethod();
System.out.println("实现类复写重名默认方法!!!!");
}
}
@Test
public void testDefaultFunctionInterface(){
//可以直接使用接口名.静态方法来访问接口中的静态方法
JDK8Interface1.staticMethod();
//接口中的默认方法必须通过它的实现类来调用
new JDK8InterfaceImpl1().defaultMethod();
//多实现类,默认方法重名时必须复写
new JDK8InterfaceImpl2().defaultMethod();
}
4 方法引用,与Lambda表达式联合使用
public static class Car {
public static Car create( final Supplier< Car > supplier ) {
return supplier.get();
}
public static void collide( final Car car ) {
System.out.println( "静态方法引用 " + car.toString() );
}
public void repair() {
System.out.println( "任意对象的方法引用 " + this.toString() );
}
public void follow( final Car car ) {
System.out.println( "特定对象的方法引用 " + car.toString() );
}
}
@Test
public void testMethodReference(){
//构造器引用。语法是Class::new,或者更一般的Class< T >::new,要求构造器方法是没有参数;
final Car car = Car.create( Car::new );
final List< Car > cars = Arrays.asList( car );
//静态方法引用。语法是Class::static_method,要求接受一个Class类型的参数;
cars.forEach( Car::collide );
//任意对象的方法引用。它的语法是Class::method。无参,所有元素调用;
cars.forEach( Car::repair );
//特定对象的方法引用,它的语法是instance::method。有参,在某个对象上调用方法,将列表元素作为参数传入;
final Car police = Car.create( Car::new );
cars.forEach( police::follow );
}