繁体   English   中英

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

[英]Static method cannot access instance members of a class

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

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

有道理,而:

 someNonStaticMethod.myClass

要么

 someStaticMethod.myClass

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

请帮助解除我的困惑。

-DI

访问实例成员意味着访问实例的字段或属性 ,而不是实例本身,因为它不会编译。 一个点并不意味着以你想到的确切方式“访问”,我猜这是你所拥有的混乱的根源。 点用于调用特定对象上的方法(请参阅此链接 )或访问对象的字段(如果字段为静态,则为类)。

例如,假设类定义如下:

class MyClass {

   private int x;

   static void foo() {
      ... // foo cannot access member x
   }
}

因此在方法foo ,您不能引用x因为它是MyClass的成员字段,它绑定到MyClass实例

另请参阅了解类成员以了解静态成员和实例成员之间的区别。

您无法从静态方法访问实例变量。

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

静态方法不能引用类的非静态实例字段。

如果您想了解原因:可以在没有类实例的情况下调用静态方法,因此在调用方法时无论如何都不会存在非静态方法。

它在谈论这个:

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实例变量。

可以通过创建对象来访问静态方法中的实例变量

public class Test {
int x =10;

public static void main(String[]args)
{
    Test t1 = new Test();
    System.out.println(t1.x);
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM