我理解变量是静态的,因为接口无法实例化,接口变量不是特定于对象,因为它是静态的。
我们知道静态变量或方法不能被object实例化。我们必须按类名调用它们。
我一直在挖掘接口以更好地理解它。
当类扩展接口时,接口中的变量可以不使用接口名称访问。它是如何工作的?
任何人都可以进一步解释我的理解吗?
答案 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.4.1节)。
基本上它说的是,如果你给出一个不合格的标识符,那么编译器会将它与局部变量,当前方法的参数或字段(实例或静态)相匹配并使用它;如果没有匹配项,或者有多个匹配项,则代码将无法编译。因此,如果它编译,则意味着该引用是明确的。 (这并不意味着它必然是好的做法;如果你使用接口名称限定它,它将更清楚其他程序员,当然不会有与其他标识符可能发生冲突导致编译错误的问题。)
答案 4 :(得分:0)
我想提出一个与其他答案略有不同的观点,希望更直观一些。
接口通常可以被认为是仅具有虚拟(抽象)方法的抽象类。不同之处在于,在Java中,您可以实现多个接口,但不能从多个类继承。
如果您有一个定义静态final字段的类,则其所有子类都可以访问它,就像它们可以访问其他(非私有)字段一样。当您将接口视为类时,您的问题的答案就变得显而易见了 - 它是超类(接口)的一部分,它应该被继承。
请注意,如果在两个界面中定义相同的名称,则会出现问题 - 这是Java首先没有多重继承的原因之一。