簡體   English   中英

Java8:當引用的方法不是靜態的時,為什么引用的方法不能編譯?

[英]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());

要引用非靜態方法,您需要一個實例,

  • 如果從靜態方法(如main)調用它,則將具有: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM