在Java中通过对象引用访问静态变量
为什么我们可以通过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
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)中,则结果是一个变量,即主表达式类型的类中指定的类变量