扩展接口只需添加要在任何实现者中定义的其他操作,并且不能破坏任何现有的实现(与扩展类不同)。但它可以改变( EDIT 3 WHICH CONSTANTS),因此常数的PERCIEVED值( EDIT 2 由实现类别看到)。 / p>
例如,以下内容:
interface A {
int TEST = 6;
}
interface B extends A {
int TEST = 7;
}
public class InterfacesTest implements B {
public static void main(final String[] args) {
System.out.println(TEST);
}
}
产生7,当接口A
的意图可能是A
的任何实现都包含一个值为6的test
字段时。
如果要宣布A 最终,我们可以确保A
的所有实施都看到test
的相同值。
所以有人理解为什么这是不可能的吗?
P.S。:这是不的副本 this question,我知道他们 不能是最终的,我对设计背后的想法很感兴趣 导致这一结果的决定。
P.P.S。:我理解常数 接口通常是个坏主意, 这不是问题。
编辑:请检查修订历史记录,此问题的标题是以不反映问题意图的方式编辑的。对于回答我没问的问题的每个人都很抱歉。是的,接口字段是隐式的公共静态最终,不幸的是,这根本不是我感兴趣的。
编辑2 要绝对清楚:这个问题是关于为什么接口不能阻止其他接口扩展它(通过 final 或某些等价物)。< / p>
答案 0 :(得分:11)
是最终版。事实上,即使您没有声明这些,也是public static final
。你正在做的不是重写常量变量;你正在隐藏父接口的版本。
检查出来,A.TEST没有被覆盖。它仍然是6。
的System.out.println(A.TEST);
答案 1 :(得分:5)
接口的主要目的不是常量的容器,而是定义一些由具体类实现的API。
并且,从lang规范(9.4. Abstract method declarations
):
请注意,接口中声明的方法不能声明为final或发生编译时错误。但是,在接口中声明的方法可以通过在实现接口的类中声明为final的方法来实现。
答案 2 :(得分:3)
据我了解,接口不应对实现施加限制。他们应该定义合同(API)
从这一点来看,方法doIt
和常量TEST
都是API的元素。我们知道如何使用它们,但我们不知道里面是什么
如何在doIt
中实现方法InterfacesTest
或确切的值常量TEST
- 实现细节。
答案 3 :(得分:2)
您有两个名为TEST的变量,而不是一个。没有压倒一切。覆盖只适用于方法。
答案 4 :(得分:1)
最终方法无法覆盖。
final会阻止字段被更改,但不会阻止它被隐藏。注意:您无法覆盖字段。
在你的情况下A.TEST被B.TEST隐藏
System.out.println(A.TEST);
System.out.println(B.TEST);
会打印
6
7
答案 5 :(得分:0)
If A were to be declared final we could be assured all implementations of A see the same value of test.
可能是你已经回答了自己写的那个问题。
你也不能创建一个最终的抽象类,因为要理解它必须实现,同样的东西适用于它必须由某个类实现。