为什么类声明中“extends”在“implements”之前?

53

为什么在类声明中,implement 必须始终写在 extend 之后?例如:

public class Register extends ActionSupport implements ModelDriven
为什么它不能是这样:
public class Register implements ModelDriven extends ActionSupport 

后者会产生编译时错误。


18
因为这就是Java的特性。 - Dave Newton
3
因为这是词法分析器规定的方式? - Makoto
1
出于好奇,为什么顺序对你很重要?你想通过改变顺序来实现什么吗? - Nathaniel Ford
@NathanielFord 新的单词顺序。 :) - weltraumpirat
我认为我们必须问一下James Gosling为什么这样做。=) - Paul Vargas
显示剩余3条评论
2个回答

107
当Java编译器将一个类转换为字节码时,它必须首先查找父类。这是因为类的基本实现方式是指向父类的字节码 - 其中包含相关的方法和字段。然后,它会添加指向子类函数代码的指针 - 其中一些由“implements”关键字强制执行。
由于父类必须可编译,如果编译器事先知道该类,就更容易。此外,您只能扩展一个类,但可以实现任意数量的接口。如果extends关键字可以在任意数量的implements指令之间交错使用,则编译时间会增加。编译器希望尽可能快速地失败以减少开发时间,因此这个选择是合乎逻辑的。此外,出于同样的原因,它有助于您清晰地思考类。

3
终于有一个理智的回答了,谢谢 :) +1 - weltraumpirat
4
我会尽力而为。毕竟,我们都在这个事情中共同努力! - Nathaniel Ford
2
@NathanielFord,我们真的吗?我被严重误导了。 - jn1kk
1
太好了,我很高兴发现有人给出了具体的答案,而不是像“因为Java就是这样”、“因为词法分析器规定它是这样”的垃圾回答。这些只会削弱社区的力量。 - Will
1
@Ssenyonjo,我不太确定你所说的“这个”是什么意思,但在 Kotlin 中,接口的类声明与 Java 有很大不同。虽然 Kotlin 也是一种 JVM 语言,但我不确定这个事实是否真的适用于这里所问的问题? - Nathaniel Ford
显示剩余3条评论

5

可能是为了让编译器的工作更容易。这只是一种惯例,能够重新排列这些内容并没有任何优势。

这就像问为什么Java函数不是用前缀表示法写成 public int add(int a, int b){ return a+b; }


关于 C 的一些事情。由于代码被阅读的次数比编写的次数多,因此冗长有益。 - Paul Vargas
1
这不是一个惯例,而是一条语法规则。惯例可以忽略,规则由编译器强制执行。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接