在梁的第9版 Java编程简介中指出,"静态方法无法访问类的实例成员," (第312页)。我明白为什么类的实例成员需要访问方法(可能是静态的),但为什么方法需要访问实例成员?对我来说,"访问"意味着通过点运营商进行访问。"换句话说:
Class myClass = new Class();
myClass.someStaticMethod();
有道理,而:
someNonStaticMethod.myClass
或
someStaticMethod.myClass
没有。是否允许someNonStaticMethod.myClass语法?我不相信我见过这样的格式化。如果不允许,为什么提到静态方法无法访问类的实例成员?
请帮助解除我的困惑。
-DI
答案 0 :(得分:4)
访问实例成员意味着访问实例的字段或属性,而不是实例本身,因为它无法编译。点不代表"访问"以你想的确切方式,我猜这是你有困惑的根源。点用于调用特定对象上的方法(请参阅此link)或访问对象的字段(如果字段为静态,则为类)。
例如,假设类定义如下:
class MyClass {
private int x;
static void foo() {
... // foo cannot access member x
}
}
因此,在方法foo
中,您无法引用x
,因为它是MyClass
的成员字段,绑定到实例 MyClass
。
另请参阅Understanding Class Members以了解静态成员和实例成员之间的区别。
答案 1 :(得分:1)
您无法从静态方法访问实例变量。
public class Example {
private Object instanceVariable;
public static void staticMethod() {
// Cannot use this in a static context
this.instanceVariable = null;
}
}
您可以从实例方法中访问实例变量。
public class Example {
private Object instanceVariable;
public void instanceMethod() {
this.instanceVariable = null;
}
}
您不应使用this
从实例方法访问静态变量。
public class Example {
private static Object staticVariable;
public void instanceMethod() {
// The static field Example.staticVariable should be accessed in a static way
this.staticVariable = null;
}
}
您始终可以访问静态变量。你应该使用班级名称。
public class Example {
private static Object staticVariable;
public void instanceMethod() {
Example.staticVariable = null;
}
}
答案 2 :(得分:0)
静态方法不能引用类的非静态实例字段。
如果你想了解原因:可以在没有类实例的情况下调用静态方法,因此在调用方法时无论如何都不会存在非静态方法。
答案 3 :(得分:0)
正在谈论这个:
public MyClass
{
private String test;
public static String getTest()
{
return this.test; //this is not possible because a static method cannot access an instance variable or method
}
}
静态方法无法访问实例变量的原因是因为静态引用类而不是类的特定实例,因此没有要访问的实例变量。只有在使用new MyClass
时才会存在测试。现在测试将存在。但是,如果我调用静态方法MyClass.getTest()
,则不会创建test
实例变量。
答案 4 :(得分:-1)
可以通过创建对象
来访问静态方法中的实例变量^([0-9]{2}\s?){5}$
}