从最初开始,只要是进行引用都是针对于引用类型完成的,也就是只有数组、类、接口具备引用操作。但是JDK1.8 开始追加了方法引用的概念。实际上引用的本质就是别名。所以方法的引用也是别名的使用。而方法引用的类型有 四种形式:
- 引用静态方法:类名称::static 方法名称 ;
- 引用某个对象的方法:实例化对象 :: 普通方法 ;
- 引用某个特定类的方法: 类名称 :: 普通方法 ;
- 引用构造方法: 类名称 :: new 。
@FunctionalInterface//函数式接口,可以有default定义的默认方法以及除了Object中的方法
interface IUtil2<R>{
R convert();
default void fun(){
System.out.println("It is all right!");
}
String toString();
}
@FunctionalInterface
interface IUtil3<T>{
T convert1();
}
@FunctionalInterface
interface IUtil4<T,R>{
T convert2(R r);
}
@FunctionalInterface
interface IUtil1<T,P,D>{
T convert(P p,D d);
}
public class TextMethodRef {
public static void main(String[] args) {
String str = "HELLO";
//IUtil2<String> iUtil2 = ()->
// str.toLowerCase();
IUtil4<String,Integer> iUtil4 = String::valueOf;//引用静态方法
IUtil3<String> iUtil3 = "hello"::toUpperCase;//引用对象方法
IUtil2<String> iUtil2 = str::toLowerCase;//引用普通方法
IUtil1<persons,String,Integer> iUtil1 = persons::new;//引用构造方法
System.out.println(iUtil2.convert());
System.out.println(iUtil3.convert1());
System.out.println(iUtil4.convert2(1000));
System.out.println(iUtil1.convert("杰西卡",18));
}
}
class persons {
private String name;
private int age;
public persons(String name,int age){
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "名字是:"+this.name+" "+"年龄为:"+this.age;
}
}