[英]Java8: Why the reference method don't compile when the referenced method isn't static?
我試圖弄清楚使用lambda和ReferenceMethod之間的區別,但是我沒有弄清楚如何引用非靜態方法?
public class ReferenceMethod {
public void main(String[] argv) {
Thread t = new Thread(ReferenceMethod::printMessage); // CE
Thread t2 = new Thread(() -> printMessage());
t.start();
}
public void printMessage() {
System.out.println("Hello");
}
}
非靜態方法僅在定義它們的類的實例的上下文中才有意義。 這些類並非總是具有瑣碎的構造函數,因此您不能指望實例是動態創建的,而應該自己提供。
完成后,可以很容易地從實例中引用它們:
ReferenceMethod myInstance = new ReferenceMethod();
Thread t3 = new Thread(() -> myInstance.printMessage());
要引用非靜態方法,您需要一個實例,
instance::method
this::method
public void refFromNonStatic() {
Thread t = new Thread(this::printMessage); //ref non-static method in non-static context
t.start();
}
public void printMessage() {
System.out.println("Hello");
}
public static void main(String[] argv) {
ReferenceMethod r = new ReferenceMethod();
Thread tStatic = new Thread(r::printMessage); //ref to non-static in static context
Thread t2 = new Thread(() -> r.printMessage());
t2.start();
tStatic.start();
r.refFromNonStatic();
}
嘗試制作方法:
public static void printMessage() {
System.out.println("Hello");
}
就像您無法在主體中調用實例方法一樣,您也無法在主體中擁有帶有實例方法的Method引用。
編輯:並且也使您的main
開始:
public static void main(String[] args) {
..
}
將ReferenceMethod::printMessage
更改為this::printMessage
。
為了理解Java中的雙冒號運算符,我將從這里開始 。 但基本上,當您使用static
,會將該方法附加到該特定類,而不是該類的實例。 當您刪除static
,即表示此類的每個實例都將具有此方法。 因此,因為您的方法printMessage()
上沒有static
printMessage()
,所以這意味着類ReferenceMethod
將沒有名為printMessage()
的方法,但是ReferenceMethod
類型的實例將具有方法printMessage()
。
因此,假設main方法實際上應該是靜態的,我認為這是任何Java程序都必須運行的要求,那么您的代碼實際上應該像這樣。 我沒有嘗試編譯它,所以如果我錯了,請糾正我。
public class ReferenceMethod {
public static void main(String[] argv) {
Thread t = new Thread(ReferenceMethod::printMessage); // CE
Thread t2 = new Thread(() -> printMessage());
t.start();
}
public static void printMessage() {
System.out.println("Hello");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.