Java错误:Non-static method cannot be referenced from a static context

当我们使用 Java 时,经常会遇到需要更深入地了解该语言的复杂性的问题。一个常见的难题是错误消息:“非静态方法……无法从静态上下文中引用。” 这个错误对于初学者来说可能令人望而生畏,甚至可能让经验丰富的程序员感到困惑。

在本教程中,我们将深入研究此错误背后的原因并探索解决方法。

什么是静态上下文
在解决非静态方法问题之前,让我们先了解一下 Java 中静态上下文的概念。

在Java中,关键字“ static ”用于声明属于类而不是实例的元素。静态成员在类的所有实例之间共享,并且无需创建该类的对象即可访问。

然而,另一方面,非静态方法与类的实例相关联,并且在不创建对象的情况下无法调用。它们可以依赖于对象的特定状态,并且它们的行为可能会根据实例变量的值而变化。

当尝试从静态上下文调用非静态方法时,会出现编译错误“非静态方法……无法从静态上下文引用”。该静态上下文可以是静态方法、静态块或始终是静态的main()方法。

我们有几种方法来解决问题:
从静态上下文调用静态方法
第一个解决方案是将实例方法变成静态方法。如果我们已经完成了该转换,那么从静态上下文中调用它就不会有任何问题:

class ToolBox {
    private static String concatStatic(String str1, String str2) {
        return str1 + str2;
    }

    static String joinTwoStrings(String str1, String str2) {
        return concatStatic(str1, str2);
    }
}

正如我们在上面的代码中看到的,为了更容易发现我们所做的更改,我们使用了新的方法名称concatStatic。此外,我们通过添加static关键字使其成为静态方法。

创建实例并调用实例方法
有时,需求不允许我们将实例方法更改为静态方法。这种情况下,我们可以重构静态方法,先创建实例,然后调用实例方法:

class ToolBox {
    private String concat(String str1, String str2) {
        return str1 + str2;
    }

    static String creatingInstanceJoinTwoStrings(String str1, String str2) {
        ToolBox toolBox = new ToolBox();
        return toolBox.concat(str1, str2);
    }
}

知识扩展点:静态方法可以被实例调用
在Java中,允许从实例方法调用静态方法。这是因为静态成员不绑定到特定实例。相反,它们与类本身相关联,并且可以使用类名来调用。