接口的组成
常量:默认是 public static final
方法:默认是 public abstract
jdk8中,增加了默认方法(public default),静态方法(public static)
jdk9中,增加了私有方法
public interface eatable {
void funAbstract();//抽象方法,实现类必须进行实现
//默认方法和静态方法都需要方法体
//默认方法:不强制实现类必须重写, 实现类可以直接使用
//主要用于接口的升级,而不破坏现有的代码
default void funDefault(){System.out.println("默认方法");}
//接口中的静态方法只能被接口调用
static void funStatic(){System.out.println("静态方法");}
}
// 实现抽象方法并调用默认方法
((eatable) () -> System.out.println("实现抽象方法")).funDefault();
// 实现抽象方法并调用抽象方法
((eatable) () -> System.out.println("实现抽象方法")).funAbstract();
// 接口中的静态方法只能被接口调用,不能被实现类调用
eatable.funStatic();//OK
((eatable) () -> System.out.println("实现抽象方法")).funStatic();//Error
方法引用
使用已有的方法逻辑去处理接口中的那个抽象方法
引用类中的静态方法
// 抽象方法的参数全部传递给被引用的静态方法
((eatable) s -> Integer.parseInt(s)).toInt("2349645");//lambda形式
((eatable) Integer::parseInt).toInt("23");//类名::静态方法
interface eatable {void toInt(String s);}
引用类中的非静态方法
// 抽象方法的参数 全部传递给 被引用的非静态方法
((eatable)s -> System.out.println(s.toUpperCase())).toUpper("fdf");
((eatable)new linshi()::printString).toUpper("fsdf");//借助对象,引用类中的非静态方法
class linshi {
public void printString(String s){System.out.println(s.toUpperCase());}
}
interface eatable {void toUpper(String s);}
也可以这样:
但注意:接口中的那个抽象方法 第一个参数的参数类型 得是 linshi
,后面的参数传给了 printString
方法。
((eatable)(s,a) -> System.out.println(a.toUpperCase())).toUpper(new linshi(),"fgwerg");
//使用这种 类名::非静态方法 形式的时候
//接口中的那个抽象方法第一个参数的参数类型得是linshi
//之后的参数都传给printString方法
((eatable)linshi::printString).toUpper(new linshi(),"grg");
class linshi {public void printString(String s){System.out.println(s.toUpperCase());}}
//第一个参数作为调用者
//第二个参数给到printString方法去作为参数
interface eatable {void toUpper(linshi a,String s);}