You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:05:39