静态方法可以访问非静态实例变量吗?

SER*_*ich 8 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 repair(Laptop laptop) {
    laptop.memory = "2GB";
  }
}
Run Code Online (Sandbox Code Playgroud)

哪个编译没有错误.

所以不是

public static void repair(Laptop laptop) {
laptop.memory = "2GB";
}
Run Code Online (Sandbox Code Playgroud)

访问类Laptop中定义的String内存,这是非静态实例变量?

由于代码编译没有任何错误,我假设我不理解这里的东西.有人可以告诉我我不理解的事吗?

Tho*_*mas 24

静态方法可以访问它知道的任何实例的非静态方法和字段.但是,如果它不知道要操作哪个实例,则它无法访问任何非静态的内容.

我认为你错误的是这样的例子不起作用:

class Test {
  int x;

  public static doSthStatically() {
    x = 0; //doesn't work!
  }
}
Run Code Online (Sandbox Code Playgroud)

这里静态方法不知道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
  }
}
Run Code Online (Sandbox Code Playgroud)