Java 静态方法能否访问非静态实例变量?

Java 静态方法能否访问非静态实例变量?,java,variables,static,Java,Variables,Static,所以我的理解是不能使用静态方法访问非静态变量,但我遇到了以下代码 class Laptop { String memory = "1GB"; } class Workshop { public static void main(String args[]) { Laptop life = new Laptop(); repair(life); System.out.println(life.memory); } public static void r

所以我的理解是不能使用静态方法访问非静态变量,但我遇到了以下代码

class Laptop {
  String memory = "1GB";
}
class Workshop {
  public static void main(String args[]) {
    Laptop life = new Laptop();
    repair(life);
    System.out.println(life.memory);
    }
  public static void repair(Laptop laptop) {
    laptop.memory = "2GB";
  }
}
它编译时没有错误

不是吗

public static void repair(Laptop laptop) {
laptop.memory = "2GB";
}
访问类Laptop中定义的字符串内存,它是非静态实例变量


由于代码编译时没有任何错误,我假设我不理解这里的某些内容。有人能告诉我我不明白的地方吗?

您只能通过
对象引用来访问


如果在静态上下文中使用,则在类级别定义的实例变量必须使用对象名限定但这并不意味着您根本无法访问。

静态方法可以访问它知道的任何实例的非静态方法和字段。但是,如果不知道在哪个实例上操作,它就不能访问任何非静态的内容

我认为你误解了这样一个不起作用的例子:

class Test {
  int x;

  public static doSthStatically() {
    x = 0; //doesn't work!
  }
}
在这里,静态方法不知道应该访问
Test
的哪个实例。相反,如果它是一个非静态方法,它会知道
x
指的是
this.x
(此处
this
是隐式的),但
this
在静态上下文中不存在

但是,如果您提供对实例的访问,即使是静态方法也可以访问
x

例如:

class Test {
  int x;
  static Test globalInstance = new Test();

  public static doSthStatically( Test paramInstance ) {
    paramInstance.x = 0; //a specific instance to Test is passed as a parameter
    globalInstance.x = 0; //globalInstance is a static reference to a specific instance of Test

    Test localInstance = new Test();
    localInstance.x = 0; //a specific local instance is used
  }
}

静态方法无法修改其值。 您可以通过使用当前类的引用访问它们来获取它们的当前值。

试试这段代码

public static void repair() {

    Laptop laptop =new Laptop();

    laptop.memory="2GB";

  }

是的,非静态方法可以访问静态变量或调用Java中的静态方法。这是没有问题的,因为静态成员

i、 静态变量和静态方法都属于一个类,可以从任何地方调用,这取决于它们的访问修饰符

例如,如果静态变量是私有的,则只能从类本身访问它,但可以从任何地方访问公共静态变量


类似地,可以从同一类的非静态方法调用私有静态方法,但可以从任何位置调用公共静态方法,例如
main()

如果您在Workshop中有一个非静态字段,则无法从静态上下文访问该字段。但是,访问您在静态上下文中创建的非静态对象的非静态字段是非常好的。需要注意的一点是globalInstance是静态的。如果globalInstance.x不是静态的,dosthStaticly方法将无法访问它。