Java 中非静态变量为何不能在静态上下文中使用?

2025年3月27日 | 阅读 4 分钟

Java 中非静态变量不能在静态上下文中引用的错误,主要是初学者在编译 Java 程序时经常遇到的。该错误发生的原因是他们在 main() 方法中使用了非静态成员变量。因为 Java 中的 main() 方法是一个静态方法,并且是自动调用的,我们不需要创建对象来调用它。为了理解这个错误,我们首先需要理解静态非静态Java 方法

静态方法

Java 中,公共方法属于类的实例,但如果我们谈论静态方法,它们属于类而不是类的实例。调用静态方法不需要创建类的实例。静态成员只能访问静态数据成员并更改其值。

需要牢记的是,实用工具函数和其他不依赖于任何特定对象状态的操作通常使用静态方法来执行。因此,它们可用于执行适用于类所有实例的通用操作或数学计算等任务。

非静态方法

所有名称前面没有 static 关键字的方法都称为非静态方法。访问静态方法和静态变量不需要创建类的实例。非静态方法通过动态或运行时绑定使用。与静态方法不同,我们可以重写非静态方法。

当执行需要访问对象特定状态的操作时,通常使用非静态方法。它们可以执行特定于类的每个实例的操作并与实例变量一起使用。由于非静态方法封装了与特定实例相关的功能,因此它们对于在面向对象编程中定义对象行为至关重要。

让我们创建一个 Java 程序并生成相同的错误。

在下面的示例中,我们在 main() 方法之前声明了一个 int 类型的私有变量 number。在 main() 方法中,我们尝试将 number 加 1。需要注意的是,main() 方法是静态方法,而变量是非静态的。当我们编译上述程序时,我们会得到相同的错误,如下所示。

StaticExample1.java

输出

Why non-static variable cannot be referenced from a static context in Java

现在,让我们将变量 number 声明为静态并编译代码。注意,变量和 main() 方法都是静态的。

StaticExample2.java

输出

Why non-static variable cannot be referenced from a static context in Java

非静态变量的每个实例都保存一个不同的值,并在 new() 运算符初始化对象时实例化。相反,静态变量在类加载到 Java 虚拟机 (JVM) 时被创建或初始化,并在类的所有实例之间共享。

访问非静态变量需要类的实例,因为每个实例都封装了其自己独特的状态。通过创建多个对象并为非静态变量分配不同的值,我们可以观察每个对象如何维护其独立的状态。

相比之下,静态变量使用类名进行访问,并且可以在不需要实例的情况下进行操作,因为它们与类相关而不是与特定实例相关。理解这些区别对于在 Java 编程中正确使用静态和非静态变量至关重要。

StaticExample3.java

输出

Why non-static variable cannot be referenced from a static context in Java

解释

提供的代码中定义了两个类:StaticExample 和 Variable。静态函数 increment() 和实例变量 number 都是 Variable 类的一部分。由于 number 变量未指定为静态,因此 increment() 方法在尝试增加它时会遇到错误。

StaticExample 类的 main 函数中创建了 Variable 类的三个实例,分别是 var1、var2 和 var3。每个实例的 number 变量具有不同的值,分别为 12、13 和 14。尽管 number 是一个实例变量,不能直接在静态环境中访问,但在调用 variable.increment() 时,它会尝试增加 number 变量。

错误解决方案

有一个简单的方法可以解决“非静态变量不能在静态上下文中引用”的错误。在上面的代码中,我们必须使用对象名称来引用非静态变量。简单来说,我们必须创建一个类的对象来从静态上下文引用非静态变量。当创建一个变量的新实例时,会为所有非静态变量创建新副本。因此,我们可以通过使用类新实例的引用来访问这些变量。例如,考虑以下 Java 程序。

StaticExample4.java

输出

Why non-static variable cannot be referenced from a static context in Java

解释

提供的代码中定义了一个名为 staticExample 的类,其中包含一个实例变量 number。可以通过在 main 函数中创建 staticExample 的新实例来访问非静态变量 number。之后,number 的值会加一并显示在控制台上。为了修复“非静态变量不能在静态上下文中引用”的问题,这展示了如何通过实例化包含该变量的类来在静态上下文中使​​用非静态变量。