java接口中的最终静态变量

时间:2016-06-05 10:13:42

标签: java

我理解变量是静态的,因为接口无法实例化,接口变量不是特定于对象,因为它是静态的。

我们知道静态变量或方法不能被object实例化。我们必须按类名调用它们。

我一直在挖掘接口以更好地理解它。

当类扩展接口时,接口中的变量可以不使用接口名称访问。它是如何工作的?

任何人都可以进一步解释我的理解吗?

5 个答案:

答案 0 :(得分:1)

  

我们必须[按类名限定访问静态字段]。

只有从课堂外访问这些字段时才会出现这种情况。然而,类本身的内部方法不需要这样的解引用:

class Test {
    public static final String NAME = "Hello";
    public void sayName() {
        System.out.println(NAME);
    }
}

上面的代码编译,即使NAME是静态字段。

  

当类扩展接口时,接口中的变量可以不使用接口名称访问。它是如何工作的?

同样的逻辑适用于继承的静态字段。只要允许该类访问某个字段,就可以选择使用继承类中的类或接口名称来限定此访问权限。

答案 1 :(得分:0)

实现接口的类可以访问接口成员字段,因为它们默认是公共的,并且实现意味着该类与接口具有is-a关系。

请参阅Is there any relation between the class that implements interface and that interface?

答案 2 :(得分:0)

你没有必须使用类名访问静态变量,这只是一个好习惯。 静态变量 也可以通过实例引用访问,当实例引用为null时,会出现唯一的反直觉和意外情况。

Re:类实现接口继承了接口

中定义的静态变量

答案 3 :(得分:0)

这由§6.5.6.1 of the JLS

涵盖
  

如果表达式名称由单个标识符组成,那么在标识符出现的位置必须只有一个声明表示局部变量,参数或字段可见(第6.4.1节)。

基本上它说的是,如果你给出一个不合格的标识符,那么编译器会将它与局部变量,当前方法的参数或字段(实例或静态)相匹配并使用它;如果没有匹配项,或者有多个匹配项,则代码将无法编译。因此,如果它编译,则意味着该引用是明确的。 (这并不意味着它必然是好的做法;如果你使用接口名称限定它,它将更清楚其他程序员,当然不会有与其他标识符可能发生冲突导致编译错误的问题。)

答案 4 :(得分:0)

我想提出一个与其他答案略有不同的观点,希望更直观一些。

接口通常可以被认为是仅具有虚拟(抽象)方法的抽象类。不同之处在于,在Java中,您可以实现多个接口,但不能从多个类继承。

如果您有一个定义静态final字段的类,则其所有子类都可以访问它,就像它们可以访问其他(非私有)字段一样。当您将接口视为类时,您的问题的答案就变得显而易见了 - 它是超类(接口)的一部分,它应该被继承。

请注意,如果在两个界面中定义相同的名称,则会出现问题 - 这是Java首先没有多重继承的原因之一。