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

时间:2016-07-08 09:43:13

标签: 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";
  }
}

编译没有错误。

所以不是

public static void repair(Laptop laptop) {
laptop.memory = "2GB";
}

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

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

5 个答案:

答案 0 :(得分:20)

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

我认为你错误地通过这样的例子做错了:

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

答案 1 :(得分:0)

您只能使用object reference进行访问。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

即静态变量和静态方法都属于一个类,并且可以根据其访问修饰符在任何地方调用。

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

类似地,可以从相同类别的非静态方法中调用私有静态方法,而从公共静态方法中调用私有静态方法,例如: main()可以从任何地方调用

答案 4 :(得分:-1)

尝试此代码

public static void repair() {

    Laptop laptop =new Laptop();

    laptop.memory="2GB";

  }