在java中利用对象的引用传递可以实现不同的对象名称操作同一块堆内存空间的操作,JDK1.8开始,方法也支持引用操作,这样就相当于为方法定义了别名。方法的引用形式有以下4种。
- 引用静态方法:类名称::static方法名称。
- 引用某个对象的方法:实例化对象::普通方法。
- 引用特定类型的方法:特定类::普通方法。
- 引用构造方法:类名称::new。
范例:引用静态方法
本次将引用在String类里的valueOf()静态方法(public static String valueOf(int x))
@FunctionalInterface //函数式接口
public interface IFunction269A<P, R> { //P描述的是参数,R描述的是返回值
public R change(P p); //随意定义一个方法名称,进行方法引用
}
public class Java269A {
public static void main(String[] args) {
//引用String类中所提供的一个静态方法
IFunction269A<Integer,String> fun=String::valueOf;
String str=fun.change(100); //利用change()表示valueOf()
System.out.println(str.length()); //调用String类方法
}
}
执行结果
3
本程序定义了一个IFunction269A的函数式接口,随后利用方法引用的概念引用了String.valueOf()方法,并且利用此方法的功能将int型转为String型对象
范例:引用普通方法。
引用String类中字符串转大写的方法:public String toUpperCase()。
@FunctionalInterface
public interface IFunction269B<R> {//函数式接口
public R upper(); //toUpper()方法没参数
}
public class Java269B {
public static void main(String[] args) {
//引用一个实例化对象中的普通方法
IFunction269B<String> fun="www.方法引用.com"::toUpperCase;
System.out.println(fun.upper());//转大写
}
}
执行结果
WWW.方法引用.COM
String类中提供的toUpperCase()方法一般都是需要String类的实例化对象才可以调用,所以本程序使用实例化对象引用了类中的普通方法(“www.方法引用.com”::toUpperCase)为IFunction269B接口的upper(),既调用upper()方法就可以实现toUpperCase()方法的执行结果。
在进行方法引用过程中还有另外一种形式的引用,他需要特定类的对象支持。正常情况下如果使用了“类::方法”,引用的一定是类中的静态方法,但是这种形式的也可以引用普通方法。例如,在String类里有一个方法:public int compareTo(String anotherString)。
如果要进行比较的操作,则可以采用代码形式:字符串1对象.compareTo(字符串2对象),如果真要引用这个方法就需要准备两个参数。
范例:引用特定类的普通方法
本次将引用String类的字符串比较方法:public int compareTo(String anotherString)。
public interface IFunction270A<P> {
public int compare(P p1,P p2);
}
public class Java270A {
public static void main(String[] args) {
//引用特定类的方法,此时就需要开发者传入实例化对象与参数
IFunction270A<String> fun=String::compareTo;
System.out.println(fun.compare("kkk", "KKK"));
}
}
执行结果
32
本程序直接引用了String类中的compareTo()方法,由于此方法调用时需要通过指定对象才可以,所以在使用引用方法compare()的时候就必须传递两个参数。与之前的引用操作相比,方法引用前不在需要定义具体的类对象,而是可以理解为将需要调用方法的对象作为参数进行了传递。
范例:引用构造方法
public class Penson270 {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Penson270(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Penson[姓名" + name + ", 年龄" + age + "]";
}
}
@FunctionalInterface
interface IFunction270B<R> {
public R create(String p,int a) ;
}
public class Java270B {
public static void main(String[] args) {
IFunction270B<Penson270> fun=Penson270::new;//引用构造方法
//调用create()就等价于调用new penson270(),所以必须传入两个参数
System.out.println(fun.create("张三",20));//直接输出实例化对象
}
}
执行结果
Penson[姓名张三, 年龄20]
在本程序中利用IFunction270B.create()方法实现了penson270类中双参构造方法的引用,所以在调用此方法时就必须按照penson270类提供的构造方法形式传递指定的参数。