为什么Java中没有最终接口?

时间:2010-10-08 19:48:50

标签: java oop interface

扩展接口只需添加要在任何实现者中定义的其他操作,并且不能破坏任何现有的实现(与扩展类不同)。但它可以改变( 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>

6 个答案:

答案 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.

可能是你已经回答了自己写的那个问题。

你也不能创建一个最终的抽象类,因为要理解它必须实现,同样的东西适用于它必须由某个类实现。