静态方法无法访问类的实例成员

时间:2014-12-02 15:23:55

标签: java class static-methods

在梁的第9版 Java编程简介中指出,"静态方法无法访问类的实例成员," (第312页)。我明白为什么类的实例成员需要访问方法(可能是静态的),但为什么方法需要访问实例成员?对我来说,"访问"意味着通过点运营商进行访问。"换句话说:

 Class myClass = new Class();
 myClass.someStaticMethod();

有道理,而:

 someNonStaticMethod.myClass

 someStaticMethod.myClass

没有。是否允许someNonStaticMethod.myClass语法?我不相信我见过这样的格式化。如果不允许,为什么提到静态方法无法访问类的实例成员?

请帮助解除我的困惑。

-DI

5 个答案:

答案 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}$

}