JavaFX与IntelliJ表格数据无法填充及静态方法调用报错
解决“non-static method cannot be referenced from a static context”错误
错误原因
你在MainApplication的静态main方法中直接通过类名Inventory调用addPart(),但addPart是非静态方法——非静态方法必须通过类的实例对象才能调用,直接用类名调用就会触发这个错误。另外你Inventory类里的getAllProducts、addProduct等方法也都是非静态的,后续同样会出现同类问题。
解决方案
有两种实用的处理方式,根据你的需求选择:
方案1:将Inventory的非静态方法改为静态方法
由于Inventory里的allParts、allProducts等核心集合都是静态成员,本身是全局共享的,对应的操作方法也应该设为静态,这样就能直接通过类名调用。修改Inventory类的方法,给非静态方法加上static关键字:
修改后的Inventory关键代码片段:
public class Inventory { // 原有静态成员保持不变 private static int partId = 0; private static int productId = 0; private static ObservableList<Part> allParts = FXCollections.observableArrayList(); private static ObservableList<Product> allProducts = FXCollections.observableArrayList(); // 给方法添加static关键字 public static ObservableList<Product> getAllProducts() { return allProducts; } public static void addPart(Part newPart) { allParts.add(newPart); } public static void addProduct(Product newProduct) { allProducts.add(newProduct); } public static Part lookupPart(int partId) { Part partFound = null; for (Part part : allParts) { if (part.getId() == partId) { partFound = part; } } return partFound; } // 剩余的lookupPart(String)、lookupProduct(int)、lookupProduct(String)、updatePart、updateProduct、deletePart、deleteProduct方法都添加static关键字 }
修改完成后,你原来在main方法里的Inventory.addPart(inhouse1);这类调用就能正常执行。
方案2:创建Inventory实例,通过实例调用方法
如果不想修改方法的静态属性,可以在main方法中先实例化Inventory,再通过实例对象调用方法:
修改MainApplication的main方法:
public static void main(String[] args) { // 创建Inventory实例 Inventory inventory = new Inventory(); // 示例零件创建逻辑不变 InHouse inhouse1 = new InHouse(1, "Tire", 10.99, 10, 0, 20, 125); InHouse inhouse2 = new InHouse(2, "Strut", 12.99, 27, 0, 30, 124); Outsourced outsourced1 = new Outsourced(3, "Tubing", 7.50, 5, 0, 15, "Super Parts"); Outsourced outsourced2 = new Outsourced(5, "Lens", 3.50, 22, 0, 25, "Auto Glass"); // 通过实例对象调用方法 inventory.addPart(inhouse1); inventory.addPart(inhouse2); inventory.addPart(outsourced1); inventory.addPart(outsourced2); launch(); }
注意:这种方式下,如果其他代码也需要访问库存数据,要确保使用同一个Inventory实例,否则会出现数据不共享的问题。
额外说明
你提到的抽象类Part的问题和当前错误无关——代码中创建的是InHouse、Outsourced的实例(它们是Part的具体子类,不是抽象类本身),这部分逻辑是正确的,无需修改。
内容的提问来源于stack exchange,提问作者n00biew0lf
相关产品推荐
相关产品推荐

