web-dev-qa-db-ja.com

クラス宣言で「拡張」が「実装」に先行する理由

クラス宣言でimplementの後に常にextendを記述する必要があるのはなぜですか?例えば:

public class Register extends ActionSupport implements ModelDriven

なぜできないのか:

public class Register implements ModelDriven extends ActionSupport 

後者はコンパイル時エラーを生成します。

42
lzjun

Javaコンパイラがクラスをバイトコードに変換する場合、最初に親クラスを参照する必要があります。これは、クラスの基礎となる実装が、親クラスのバイトコード関連するメソッドとフィールド次に、子クラス関数のコードへのポインターを追加します-その一部は「implements」キーワードで必須です。

親クラスはコンパイル可能である必要があるため、コンパイラがそのクラスが何であるかを事前に知っていれば簡単です。さらに、1つのクラスのみを拡張できますが、任意の数のインターフェイスを実装できます。 extendsキーワードを任意の数のimplements命令に混ぜることができる場合、コンパイル時間が長くなります。コンパイラは開発時間を短縮するためにできるだけ早く失敗したいので、この選択は論理的です。さらに、同じ理由でクラスについて明確に考えるのに役立ちます。

86
Nathaniel Ford

おそらくコンパイラの仕事を簡単にするため。それは単なる慣習です。これらのことを再配置できるという利点はありません。

それは、なぜJava関数がpublic int (int a, int b)add{ return a+b; }のような事前注文表記で書かれていないのかを尋ねるようなものです。

5
trutheality