所以我的理解是你不能使用静态方法来访问非静态变量,但我遇到了以下代码。
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内存,这是非静态实例变量?
由于代码编译没有任何错误,我假设我不理解这里的东西。有人可以告诉我我不理解的事情吗?
答案 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";
}