当前位置: 首页 > 知识库问答 >
问题:

从静态上下文引用非静态变量

梁丘俊材
2023-03-14

我在阅读Kathy and Bert SCJP1.6时遇到了以下代码:

class Bar {
int barNum = 28;
}

class Foo {
  Bar myBar = new Bar();
  void changeIt(Bar myBar) {
    myBar.barNum = 99;
    System.out.println("myBar.barNum in changeIt is " + myBar.barNum);
    myBar = new Bar();
    myBar.barNum = 420;
    System.out.println("myBar.barNum in changeIt is now " + myBar.barNum);
 }
  public static void main (String [] args) {
    Foo f = new Foo();
    System.out.println("f.myBar.barNum is " + f.myBar.barNum);
    f.changeIt(f.myBar);
    System.out.println("f.myBar.barNum after changeIt is "
    + f.myBar.barNum);
 }
}

虽然是在跟踪变量的主题下,但我无法理解如何在main()方法(static)中引用非静态变量myBar?

共有1个答案

萧英睿
2023-03-14

Java中的static变量属于,它的值对于该类的所有实例都保持不变。static变量在类加载到JVM时初始化。

另一方面,实例变量对每个实例有不同的值。当通过使用new运算符或使用类似class.newInstance()的反射创建对象的实例时,它们就会被创建。所以在你的例子中:

/* this is valid since compiler knows myBar
belongs to an instance of Foo called f */
Foo f = new Foo();
f.changeIt(f.myBar);  

/* This is invalid because compiler doesn't know which
myBar this is since it isn't connected to a class */
Foo f = new Foo();
f.changeIt(myBar); 

因此,如果您试图在没有任何实例的情况下访问一个非静态变量,编译器将给您一个错误,因为这些变量还没有创建,因此不存在。

 类似资料:
  • 我尝试使用网络豆IDE在java中创建一个简单的类。每当我试图执行这个命令时,它都会发出这样的警告。从静态上下文引用的非静态变量“。谁能告诉我为什么会发生这种情况以及如何解决它。提前感恩节。

  • 我是Android编码的n00b,今天我想尝试使用定位服务。 我设置了一个简单的类和一个简单的main,只是为了得到经度和纬度。 但当我尝试调用retrive的构造时,long and latitude Android Studio弹出了一个错误: 错误:(33,16)错误:无法从静态上下文引用非静态变量纬度 这是我的位置班

  • 我正在尝试编写一段代码,当我选中两个复选框中的一个复选框时,它将更改我选择按钮时显示的消息。 我收到的错误消息是: "FirstWindow.java:12:错误:不能从静态上下文消息中引用非静态变量消息="good job\n";" 对于第12、37、53、57行。我已尝试在main中声明字符串变量,但我只会收到错误: “FirstWindow。java:38:错误:从内部类引用的局部变量必须是

  • 我编写了以下测试代码: 但会出现以下错误: 我如何让我的方法识别我的类变量?

  • 问题内容: 我是Java新手,我正在尝试通过递归函数部署斐波那契跟踪,然后计算运行时间。这是我设法编写的代码: 问题是,当我尝试将其转换为字节码时,出现以下错误: 我想知道是什么问题?! 问题答案: 更改 至 并使该方法静态。 或者,改变 至

  • 错误来自此行板状态 addme = 新板状态(); 由于某种原因,它所指向的非静态变量是“新”的。我不清楚如何修复这个错误,因为new不应该是一个变量,也不是。 查看stackoverflow记录,该错误通常来自非静态方法,通常通过将该方法设为静态或完全绕过该方法来解决。T 下面的代码是为了引用这个语句前后发生的事情。 }……