在main()方法中访问实例变量?

4
 class Test {
     Test obj;
     public static void main(String[] args) {
         obj = new Test();
     }
 }

我知道实例变量和非静态方法在静态方法中是不可访问的,因为静态方法不知道堆上的任何内容。

我想问一下,如果main是一个静态方法,我如何访问实例变量'obj'。


将其定义为静态。 - eg04lt3r
你回答了自己的问题,你必须将它声明为 static - Michael
如果你想从静态上下文中访问非静态成员,你需要先创建包含非静态成员的类的实例。该实例为你提供了访问该实例的非静态成员所需的非静态上下文。 - JonK
3个回答

4

为什么在静态main方法中访问实例变量是不可能的:你期望访问哪个实例的实例变量?

一个可能的误解是当应用程序启动时,Java会创建您的主类的一个实例 - 这是不正确的。Java没有创建这样的实例,您将从一个静态方法开始,并且由您决定创建哪个类的实例。


解决方法:

  • Declare Test obj as static

    static Test obj;
    public static void main(String[] args) {
        obj = new Test();
    }
    
  • Declare Test obj as local variable inside main

    public static void main(String[] args) {
        Test obj = new Test();
    }
    
  • Create an instance of Test in your main, then you'll be able to access its instance variables

    static Test obj;
    public static void main(String[] args) {
        obj = new Test();
        obj.myInstanceVariable = ... // access of instance variable
    }
    

谢谢你的回答。如果我在main()方法内创建一个类的对象,那么我可以访问实例变量,因为实例变量是在对象内分配的。这就是为什么我们可以在静态方法中访问实例变量而不将它们声明为静态的原因吗? - Varun
是的,没有绝对的规则说“您不能在静态方法中访问任何实例变量”。唯一的规则是要访问实例变量,您首先需要一个实例,其实例变量您希望访问。静态方法与任何实例无关,因此您不能只是编写myInstanceVar并希望访问某些实例的变量。如果您有一个实例,则可以自由访问其实例变量。 - Jiri Tousek

2
无法在静态方法中访问非静态变量。因此,请将obj作为静态变量。
static Test obj;
public static void main(String[] args) {
   obj = new Test();
}

0

obj应该像这样是static的:

   static Test obj;

主方法也无法访问非静态成员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接