当我们继承一个类和接口时,我们必须首先编写extends然后实现但不是反之?为什么

时间:2014-03-08 11:03:09

标签: java

为什么在继承中首先我们必须首先编写扩展然后继承为什么不实现然后扩展?是什么使得在这个角度思考

class A{}
interface B{}

如果我们写

class C implements B extends A {}

它会显示编译时错误但是如果我们写

class c extends A implements B{}

它会运行正常吗?

4 个答案:

答案 0 :(得分:3)

因为它在Language Specification #8.1

中以这种方式定义
  

NormalClassDeclaration:
          ClassModifiers opt class Identifier TypeParameters opt Super opt Interfaces opt ClassBody

如您所见,扩展部分(Super opt )位于实现部分之前(Interfaces opt )。

答案 1 :(得分:2)

我认为这只是Java语言的一个简单要求。 例如,您不能编写int私有变量,访问修饰符和数据类型必须处于特殊位置。这里与继承相同(类Y扩展Z实现A)。

答案 2 :(得分:1)

答案是,它是Java语言规范中定义的设计决策。它没有解释为什么订单必须严格,但Java有严格的设计规则(这是有助于保持许多神秘错误的品质之一)。

可能的原因是extends表示比implements更强的关系(尽管两者都代表“是”或“是一种”关系)。如果某个类实现了几十个接口,并且允许在类之前列出接口,那么您可能会错过滚动屏幕的重要extends子句。

严格也使编写编译器比规则松散更容易。由于只允许一个extends类,因此只要您阅读了extends令牌和类名,就可以阅读下一个令牌。如果您可以在implements之前使用extends,那么您必须在extends之前解析接口列表。

答案 3 :(得分:0)

这很有道理:

  • 您可以使用extend关键字扩展某个类,以生成更大的类(基数+扩展名)
  • 您可以使用extend关键字扩展界面,以生成更大的界面(基础+扩展程序)。

它是相同的机制,因此同名。它是程序化“复制和粘贴”的某种形式 - 我总是喜欢它:我们从基类复制源并粘贴到另一个。我们还可以将一些文本从基本接口复制到另一个(扩展名)。

现在,我们需要区分一个类和一个接口,它是一个实际的:接口描述一个契约,类遵循一些契约。

因此,类和接口之间存在关系:class满足合同(interface)。换句话说,class implementsinterface

至于你的例子: class c extends A implements B{}可以解构为:

  • class c扩展A
  • class c实现B

一个类只能扩展另一个类。 一个类只能实现一个接口。

至于第一个例子 class C implements B extends A {} - 它无法解构,原因只是基于语法!纯粹在语法(文本)层面上是禁止的。