java-为什么应该以静态方式访问静态字段?

public enum MyUnits
{
    MILLSECONDS(1, "milliseconds"), SECONDS(2, "seconds"),MINUTES(3,"minutes"), HOURS(4, "hours");

    private MyUnits(int quantity, String units)
    {
        this.quantity = quantity;
        this.units = units;
    }

    private int quantity;
    private  String units;

 public String toString() 
 {
    return (quantity + " " + units);
 }

 public static void main(String[] args) 
 {
    for (MyUnits m : MyUnits.values())
    {
        System.out.println(m.MILLSECONDS);
        System.out.println(m.SECONDS);
        System.out.println(m.MINUTES);
        System.out.println(m.HOURS);
    }
 }
}

这是指帖子..无法回复或评论任何这样创建的新帖子。 为什么是我的

System.out.println(m.MILLSECONDS);

发出警告-应该以静态方式访问静态字段Units.MILLISECONDS吗?谢谢。

Ava asked 2019-11-08T17:26:39Z
3个解决方案
99 votes

因为当您访问静态字段时,您应该在类(或本例中为枚举)上执行此操作。 如

MyUnits.MILLISECONDS;

不在实例中

m.MILLISECONDS;

编辑要解决为什么这样的问题:在Java中,当您将某个东西声明为static时,您是在说它是类的成员,而不是对象(因此,为什么只有一个)。 因此,在对象上访问它是没有意义的,因为该特定数据成员与该类相关联。

Chris Thompson answered 2019-11-08T17:27:12Z
62 votes

实际上有一个很好的理由:
由于含糊不清,非静态访问并不总是有效。

假设我们有两个类,A和B,后者是A的子类,并且具有相同名称的静态字段:

public class A {
    public static String VALUE = "Aaa";
}

public class B extends A {
    public static String VALUE = "Bbb";
}

直接访问静态变量:

A.VALUE (="Aaa")
B.VALUE (="Bbb")

使用实例的间接访问(向编译器发出警告,应该静态访问VALUE):

new B().VALUE (="Bbb")

到目前为止,效果如此之好,编译器可以猜测要使用哪个静态变量,超类上的那个静态变量有些遥远,似乎有些逻辑。

现在到了棘手的地步:接口也可以具有静态变量。

public interface C {
    public static String VALUE = "Ccc";
}

public interface D {
    public static String VALUE = "Ddd";
}

让我们从B中删除静态变量,并观察以下情况:

  • new B().VALUE
  • new B().VALUE
  • new B().VALUE
  • new B().VALUE其中C extends D
  • new B().VALUE其中C extends D
  • ...

语句new B().VALUE现在不明确,因为编译器无法确定要使用的静态变量,并将其报告为错误:

错误:对VALUE的引用不明确
C中的变量VALUE和D中的变量VALUE都匹配

这就是为什么应该以静态方式访问静态变量的原因。

Peter Walser answered 2019-11-08T17:30:15Z
12 votes

因为...(MILLISECONDS)是一个静态字段(隐藏在枚举中,但这就是它)...但是,它是在给定类型的实例上调用的(但请参见下文,因为这并不是真的) )。

javac会“接受”,但实际上应为m(或在适用范围内不加前缀)。

1实际上,javac将代码“重写”为首选格式-如果m恰好是null,则它不会在运行时抛出NPE-永远不会在实例上实际调用它)。

快乐的编码。


我没有真正看到问题标题如何与其他问题相吻合:-)更准确,更专业的标题增加了问题/答案可以使其他程序员受益的可能性。

answered 2019-11-08T17:31:05Z
translate from https://stackoverflow.com:/questions/5642834/why-should-the-static-field-be-accessed-in-a-static-way