Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中通过对象引用访问静态变量_Java_Scope_Static - Fatal编程技术网

在Java中通过对象引用访问静态变量

在Java中通过对象引用访问静态变量,java,scope,static,Java,Scope,Static,为什么我们可以通过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 m

为什么我们可以通过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
    }   
}

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


由于member是Static类的对象,因此您可以通过member object以wll的形式访问静态类的所有静态变量。

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


由于成员是静态类的对象,所以您可以通过成员对象作为静态类的非静态变量wll访问所有静态变量。

以这种方式引用静态变量不是最佳做法

然而,你的问题是,为什么允许这样做?我猜答案是,开发人员可以将实例成员(字段或变量)更改为静态成员,而无需更改对该成员的所有引用


在多开发人员环境中尤其如此。否则,您的代码可能无法编译,因为您的合作伙伴将一些实例变量更改为静态变量。

以这种方式引用静态变量不是最佳做法

然而,你的问题是,为什么允许这样做?我猜答案是,开发人员可以将实例成员(字段或变量)更改为静态成员,而无需更改对该成员的所有引用


在多开发人员环境中尤其如此。否则,您的代码可能无法编译,因为您的合作伙伴将一些实例变量更改为静态变量。

通常,每个人都可以访问公共变量,而只能从类的当前实例中访问私有变量。在您的示例中,您可以从
main
方法访问
x
变量,因为该方法在静态类中

如果您想知道为什么允许您从静态类的另一个实例访问它,而不是从您当前所在的静态类的另一个实例访问它(私有变量通常是不允许的),这仅仅是因为静态变量不存在于每个实例的基础上,而存在于每个类的基础上。这意味着可以从的所有实例访问相同的静态变量


如果不是这样,没有人能够访问私有静态变量,因为它不属于一个实例,而是属于所有实例。

通常,每个人都可以访问公共变量,而私有变量只能从类的当前实例中访问。在您的示例中,您可以从
main
方法访问
x
变量,因为该方法在静态类中

如果您想知道为什么允许您从静态类的另一个实例访问它,而不是从您当前所在的静态类的另一个实例访问它(私有变量通常是不允许的),这仅仅是因为静态变量不存在于每个实例的基础上,而存在于每个类的基础上。这意味着可以从的所有实例访问相同的静态变量


如果不是这样,没有人能够访问私有静态变量,因为它不属于一个实例,而是属于所有实例。

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


实例对象始终可以引用静态成员,因为它属于全局(共享)到其实例的类。

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


实例对象始终可以引用静态成员,因为它属于全局(共享)到其实例的类。

允许它的原因是JLS说它是。允许这样做的具体部分有(对于
成员.x
情况)和(在这两种情况下)。后者说:

如果该字段是静态的:

  • 如果字段是非空的final字段,则结果是主表达式类型的类或接口中指定的类变量的值

  • 如果字段不是final,或者是空final,并且字段访问发生在类变量初始值设定项(§8.3.2)或静态初始值设定项(§8.7)中,则结果是一个变量,即主表达式类型的类中指定的类变量


为什么JLS允许这样做

坦白说,我不知道。我想不出什么好的理由允许他们

无论哪种方式,使用引用或
this
访问静态变量都是一个坏主意,因为大多数程序员可能会被误导,以为您使用的是实例字段。这是不使用Java这个特性的一个重要原因


在第一种和第二种情况下,应将变量引用为
x
Static.x
,而不是
member.x
。(我更喜欢
Static.x

允许它的原因是JLS说它是。允许这样做的具体部分有(对于
成员.x
情况)和(在这两种情况下)。后者说:

如果该字段是静态的:

  • 如果字段是非空的final字段,则结果是主表达式类型的类或接口中指定的类变量的值

  • 如果字段不是final,或者是空final,并且字段访问发生在类变量初始值设定项(§8.3.2)或静态初始值设定项(§8.7)中,则结果是一个变量,即主表达式类型的类中指定的类变量