为什么要以静态方式访问静态字段?

2022-08-31 13:55:31
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);

发出警告 - 应以静态方式访问静态字段 MyUnits.MILLSECONDS ?谢谢。


答案 1

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

MyUnits.MILLISECONDS;

不在实例上,如

m.MILLISECONDS;

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


答案 2

实际上有一个很好的理由:
由于模棱两可的原因,非静态访问并不总是有效

假设我们有两个类,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 中删除静态变量,并观察以下情况:

  • B implements C, D
  • B extends A implements C
  • B extends A implements C, D
  • B extends A implements C哪里A implements D
  • B extends A implements C哪里C extends D
  • ...

该语句现在是模棱两可的,因为编译器无法确定哪个静态变量的含义,并将其报告为错误:new B().VALUE

错误:对 VALUE 的引用在 C 中是变量 VALUE 还是在 D 匹配项中都不明确

这正是应该以静态方式访问静态变量的原因。


推荐