6

JLS 2.13.1 接口修改器

接口不能是最终的,因为这样的类的实现永远不会完成。

如果我可以在接口中编写创建静态内部类,我可以在其中提供实现,那么为什么会有这样的限制

interface Type {

    // Normal
    class Value {
        private Value() {
        }

        public void print() {
            System.out.println("Test");
        }
    }

    public final Value value = new Value();
}
4

4 回答 4

9

好吧,在接口中,您根本无法提供任何形式的实现:甚至没有静态方法。将任何方法设为最终方法是没有意义的,因为它们尚未实现。

代码示例:

如果假设我有一个名为的接口IExample及其具体实现Example

interface IExample{

    public final void run();

}

class Example implements IExample{

    // wait! I can't override because it's final! but it's yet to be implemented?!
    public void run(){ 
        
    }

}
于 2012-09-10T12:25:18.590 回答
4

顺便说一句:第一次定义此限制时,嵌套类不可用,所以真正的问题可能是为什么没有取消此限制。


一个final类不能有任何子类。仅使用接口来定义子类的方法被认为是最佳实践,因此两者是矛盾的。

您可以将接口用于其他事情

  • 注释
  • 文档
  • 常数
  • 仅定义嵌套类。

但这些都是接口的目的所附带的。

于 2012-09-10T12:27:48.947 回答
1

“当 final 关键字出现在类声明中时,这意味着该类可能永远不会被子类化或覆盖。这可以防止特定类的过度专业化。在某种意义上,创建该类的人认为任何进一步的更改都是相切的达到其主要目的。”

参考:最终

接口代表行为,而不是实现,因此它是最终的没有意义。

于 2012-09-11T11:22:22.377 回答
0

如果我可以在接口中编写创建静态内部类,我可以在其中提供实现,那么为什么会有这样的限制

是的,您可以在那里声明一个内部类,但要点仍然是final接口将是一个无法实现的接口。任何实现它的类都将违反final限制。Java 设计者得出的结论是,这没有多大意义,而且由于没有令人信服的具有嵌套类*的接口的用,因此没有理由放松这一限制。final

* - 我不会声称无法发明用例。但是,我从未听说过有人用内部类编写接口,其目的是不应该实现接口。

于 2012-09-10T12:41:03.270 回答