Java 为什么允许静态字段存在两次?

Java 为什么允许静态字段存在两次?,java,static,Java,Static,下面是我的问题: 我有一个带有静态变量nr的接口 public interface TestInterface { public static int nr = 1; } 以及一个实现该接口的类,它也有自己的静态变量nr public class TestClass implements TestInterface { public static int nr = 2; } 实际上,我可以毫无差错地做到这一点 public static void main(S

下面是我的问题:

我有一个带有静态变量nr的接口

public interface TestInterface {    

    public static int nr = 1;

}
以及一个实现该接口的类,它也有自己的静态变量nr

public class TestClass implements TestInterface {

    public static int nr = 2;

}
实际上,我可以毫无差错地做到这一点

public static void main(String args[]) {

        TestClass test = new TestClass();

        System.out.println(TestClass.nr);

    }`
问题:为什么允许这样做?


据我所知,静态字段在类实例中应该是通用的,但是关于超类-子类关系呢?

在您的代码中,两个
静态
字段实际上都是为单独的类型定义的,即一个用于
测试接口
接口类型,另一个用于
测试类
类类型


您需要了解的一点是,当涉及到
静态时
,没有重写,因此它们将被视为单独的字段。

在超类-子类关系中,如果子类的静态变量具有相同的名称,则超类的静态变量将被子类的静态变量隐藏。因为静态变量不是多态的。

这是语言明确允许的

如果类声明了具有特定名称的字段, 然后该字段的声明被称为隐藏 任何和所有可访问的字段声明 在超类中使用相同的名称,以及 班上的高级介面


为什么不允许它呢?
超类-子类关系
这里不存在这种关系,它只是一个实现接口的类。因为从“重新访问此代码”的角度来看,这是令人困惑的。“不可能”带来了更好的实践。接口变量应该按照约定以大写字母拼写,因为它是一个常量。隐藏,而不是阴影。静态字段不被继承是不正确的。JLS规定,
“类从其直接超类和直接超接口继承超类和超接口的所有非私有字段,这些字段可供类中的代码访问,且不被类中的声明隐藏。”
静态字段显示在该部分的示例中。@LewBloch我所说的继承是指我们不能重写,为了让它更清晰而进行了更正