許多程式設計師在編碼時面臨 Non static method cannot be referenced from a static context 錯誤訊息 此錯誤訊息非特定 只要符合錯誤條件 可在任何 IDE 發生

這是初學者常見錯誤 程式設計師嘗試在未建立類別實例情況下『靜態』使用類別 使用靜態類別時必須滿足數個條件 本文將探討幾種不同情況並指導您如何使用靜態類別
什麼是靜態方法?
在任何方法加上『static』關鍵字 使該方法稱為靜態方法 靜態方法屬於類別 而非屬於物件 (這是常態) 靜態方法可在無建立類別實例條件下輕易調用
靜態方法有多種用途 例如 可用它更改靜態資料成員及其值 但使用靜態方法仍有限制 例如 若要存取類別的非靜態欄位 必須使用非靜態方法 總結來說 靜態方法使用較少 但確有其益處
以下是靜態方法更改所有物件屬性的簡短範例:
class Students{ int roll_no; String name; static String college = "InformationTech"; static void change(){ college = "Management"; } Students (int number, String name_self){ roll_no = number; name = name_self; } void display (){System.out.println(rollno+" "+name+" "+college);} public static void main(String args[]){ Students.change(); Students stu_1 = new Students (100,"Mexican"); Students stu_2 = new Students (202,"American"); Students stu_3 = new Students (309,"British"); stu_1.display(); stu_2.display(); stu_3.display(); } }程式輸出為:
100 Mexican Management 202 American Management 309 British Management
類別與類別實例的差異
想像您在街上走 看到一輛車 您立即知道這是車 即使不知型號或類型 因您知道這屬於您已知的『cars』類別 此處將類別視為模板或概念
當您走近 看到車款和製造商 此處您識別『car』類別的『實例』 此處所有屬性將詳細呈現 輪子、馬力、輪圈等
屬性範例 類別『car』規定所有車應有輪子 您看到的車 (car 類別的一個實例) 有鋁合金輪圈
在物件導向程式設計中 您自己定義類別 在類別內定義『color』類型欄位 每當類別實例化 後端自動為 color 保留記憶體 稍後可給予特定值 (如紅色) 因這些屬性具體 為非靜態
相反 靜態方法和欄位與所有實例共享 這些為類別特有值或項目而非實例本身 對方法 可有全域方法 (如 stringtoInt 轉換器) 對欄位 通常為程式碼常數 (如若僅製造普通車 車型可為靜態)
現在 我們將探討所有編碼可能出錯的不同情況 並看修復替代方案
問題 1: 您呼叫不存在的東西
我們發現一些案例 用戶同時使用靜態和非靜態方法 這時 您應小心什麼方法呼叫什麼 (就靜態與否而言) 看以下程式碼:
private java.util.ListsomeMethod(){ /* Some Code */ return someList; } public static void main(String[] strArgs){ // The following statement causes the error. You know why.. java.util.List someList = someMethod(); }
這裡 靜態方法呼叫 someMethod 在物件導向程式設計中 我們將資料與要操作的資料封裝在一起 這裡 沒有物件 就沒有實例資料 雖然實例方法作為類別定義一部分存在 應總有物件實例為它們提供資料
總結來說 您不能呼叫不存在的東西 因您可能未建立物件 非靜態方法尚不存在 然而 靜態方法將永遠存在 (因定義)
問題 2: 方法未設為靜態
若您從靜態 main 方法調用方法且未建立方法實例 將收到錯誤訊息 此處同樣原理適用 您無法存取不存在的東西
public class BookStoreApp2 { //constants for options Scanner input = new Scanner (System.in); public static void main(String[] args) { BookStoreItem[] item;//declaring array item = new BookStoreItem[10];//initializing array int itemType = -1; printMenu(); getUserChoice(); for (int i = 0; i < item.length; i++){ }//end of switch statement }//end of for loop for (int i = 0; i < item.length; i++) { }//end of for }//end of main method此程式碼中 您需將 printMenu() 和 getUserChoice() 方法轉為靜態方法
因此 若要繞過此類情況 可使用 constructor 例如 將 main() 方法內容放入建構子
public BookStoreApp2() { // Put contents of main method here} 在 main() 方法中執行以下操作: public void main( String[] args ) { new BookStoreApp2(); }若這些技巧對您無效或程式碼不同 應牢記靜態類別和方法的基本原則 並重新檢查程式碼 確保基本原則未被違反