通过在Java中的对象引用访问静态变量通过在Java中的对象引用访问静态变量(Accessing a

2019-05-12 05:31发布

为什么我们可以通过Java中的对象引用访问静态变量,如下面的代码?

public class Static {
    private static String x = "Static variable";

    public String getX() {
        return this.x;                 // Case #1
    }

    public static void main(String[] args) {
        Static member = new Static();
        System.out.println(member.x);  // Case #2
    }   
}

Answer 1:

一般来说,公共变量人人都可以访问,而私有变量只能从类的当前实例中访问。 在您的例子中,你会允许访问x从变量main方法,因为该方法是静态类中。

如果你想知道为什么你被允许从静态类比目前(通常是不允许私有变量),你是一个的另一个实例访问它,它只是因为静态变量不上存在每个实例的基础,但在每个阶级基础。 这意味着A的相同的静态变量可以从A的所有实例进行访问。

如果不是这种情况下,没有人能够在所有访问私有静态变量,因为它不属于一个实例,但他们所有。



Answer 2:

它不是以这种方式来引用一个静态变量的最佳实践。

但是你的问题是为什么会允许吗? 我猜的答案是,开发人员可以一个实例成员(字段或变量)更改为静态成员,而不必更改该成员的所有引用。

这在多个开发人员的环境中尤其如此。 否则,你的代码可以编译失败只是因为你的伴侣改变了一些实例变量静态变量。



Answer 3:

这是允许的原因是JLS说,这是。 允许这种情况的具体章节JLS 6.5.6.2 (用于member.x例)和JLS 15.11.1 (在两种情况下)。 后者说:

如果该字段是静态的:

  • 如果该字段是一个非空最后字段,那么结果是在类或接口是主表达式的类型指定的类变量的值。

  • 如果该字段是不是最终的,或是发生在类变量初始值(§8.3.2)或静态初始化(§8.7),那么结果是一个变量,即,所指定的类变量在空白最终和字段访问的类,它是主表达式的类型。


为什么这些由JLS允许吗?

坦率地说,我不知道。 我想不出任何理由让他们。

无论哪种方式,使用参考或this访问一个静态变量是一个坏主意,因为大多数程序员可能被误导,以为你正在使用的实例字段。 这是一个强有力的理由不使用Java的这一特性。

在您的第一和第二种情况,你应该参考变量xStatic.x而非member.x 。 (我喜欢Static.x 。)



Answer 4:

静态变量,否则称为类变量,因为它们可用于该类的每个对象。

由于成员是类静态的对象,这样你就可以访问所有静态作为WLL通过成员对象的静态类的非静态变量。



Answer 5:

非静态成员是实例成员。 静态成员(类宽)无法访问实例成员,因为没有办法确定哪个实例拥有任何特定的非静态成员。

实例对象总是可以指静态成员,因为它属于哪个全局(共享)类,以它的实例。



文章来源: Accessing a static variable via an object reference in Java