簡體   English   中英

無法從靜態內容引用非靜態方法

[英]Non-static method cannot be referenced from static content

我無法編譯以下代碼:

public class Test {
 public static void main (String [] args ){
  int a = calcArea(7, 12);
  System.out.println(a);
 }

 int calcArea(int height, int width) {
  return height * width;
 }
}

出現以下錯誤:

非靜態方法calcArea(int,int)不能從靜態內容中引用

這是什么意思? 我該如何解決這個問題..?

編輯:

根據您的建議,我創建了一個新的test()實例,如下所示:

public class Test {
    int num;
    public static void main (String [] args ){
        Test a = new Test();
        a.num = a.calcArea(7, 12);
        System.out.println(a.num);
    }

    int calcArea(int height, int width) {
            return height * width;
    }

}

這個對嗎? 如果我這樣做有什么不同......

public class Test {
 public static void main (String [] args ){
  int a = calcArea(7, 12);
  System.out.println(a);
 }

 static int calcArea(int height, int width) {
  return height * width;
 }
}

你的main是靜態的,所以你可以在沒有類測試實例的情況下調用它( new test() )。 但它調用的calcArea不是靜態的:它需要一個類的實例

你可以像這樣重寫它我猜:

public class Test {
 public static void main (String [] args ){
  int a = calcArea(7, 12);
  System.out.println(a);
 }

 static int calcArea(int height, int width) {
  return height * width;
 }
}

正如評論所暗示的那樣,以及其他答案也表明,你可能不想走這條路線進行翻轉:你只會獲得靜態功能。 弄清楚代碼中實際應該是什么靜態,並且可能使自己成為一個對象並從那里調用函數:D

calcArea不能是靜態的。 要在主類中使用其他方法,必須創建其實例。

public class Test {
 public static void main (String [] args ){
  Test obj = new Test();
  int a = obj.calcArea(7, 12);
  System.out.println(a);
 }

 int calcArea(int height, int width) {
  return height * width;
 }
}

Nanne建議的肯定是解決您的問題。 但是,我認為如果你現在養成這個習慣是謹慎的,而你在學習java的過程中,盡可能少地嘗試使用靜態方法,除非適用(實用方法,例如) 。 以下是您修改的代碼,用於創建Test實例並在Test對象上調用calcArea方法:

public class Test {
 public static void main (String [] args ){
  Test test = new Test();
  int a = test.calcArea(7, 12);
  System.out.println(a);
 }

 int calcArea(int height, int width) {
  return height * width;
 }
}

當你進一步使用java進行編碼時,可能會給你編寫的代碼開始處理對象,比如某種類型的多邊形對象,像calcArea這樣的方法屬於實例上下文,而不是靜態上下文,所以它可以運行關於對象的內部狀態。 這將使您的代碼更加面向對象,減少程序性。

如果將方法定義為靜態,則意味着您可以通過類名稱調用該方法,例如:

int a = Test.calcArea(7, 12);

沒有創建對象,

這里; Test是類的名稱,但要執行此操作, calcArea()方法必須是靜態的,或者您可以在對象上調用非靜態方法; 通過實例化類來創建對象,例如:

Test a = new Test();

這里“a”是Test和類型的對象

a.calcArea(7,12);

如果該方法沒有被定義為靜態可以被調用。

你知道靜態方法是什么嗎?

如果沒有,請查找,但簡短的回答是靜態方法不能(不能)訪問“this”,因為它沒有分配給該類的任何特定實例。 因此,您無法從靜態方法中調用實例方法(非靜態方法),因為計算機將如何知道該方法應在哪個實例上運行?

你的類calcArea應該聲明為static ,如果你想使用那個類,你必須先創建一個類的實例。 在類中,應該像有人建議的那樣返回類的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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