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

新手上路,请多包涵

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

 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";
}

访问笔记本电脑类中定义的字符串内存,这是非静态实例变量?

由于代码编译没有任何错误,我假设我在这里不理解某些东西。有人可以告诉我我不明白的地方吗?

原文由 SERich 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 458
2 个回答

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

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

 class Test {
  int x;

  public static doSthStatically() {
    x = 0; //doesn't work!
  }
}

这里静态方法不知道它应该访问哪个实例 Test 。 In contrast, if it were a non-static method it would know that x refers to this.x (the this is implicit here) but 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
  }
}

原文由 Thomas 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

原文由 Govinda Hinduja 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题