在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類提供的構造方法形式傳遞指定的參數。