2012-05-10 5 views
28

:ない は、クラス宣言で「道具」を先行し実装は常に後に書かれた、たとえばクラス宣言に延びているしなければならないのはなぜ

public class Register implements ModelDriven extends ActionSupport 

は、コンパイル時にエラー

あるのはなぜ

public class Register extends ActionSupport implements ModelDriven 

+14

これはJavaの仕組みだからです。 –

+2

...それがレクサーがそれを強制する方法なので? – Makoto

+0

これはSue Oracle =) – 4lex1v

答えて

58

Javaコンパイラがクラスをバイトコードに変換するときは、最初に親クラスを探す必要があります。これは、基本的なクラスの実装では、関連するメソッドとフィールドを保持する親クラスのバイトコードをポイントするためです。次に、子クラス関数のコードへのポインタを追加します。そのうちのいくつかは、 'implements'キーワードによって指定されています。

親クラスはコンパイル可能でなければならないため、コンパイラがそのクラスが何であるかを前もって知っていれば簡単です。さらに、1つのクラスだけを拡張できますが、任意の数のインタフェースを実装できます。 extendキーワードが任意の数のインプリメンテーション命令の間に混在することができる場合、コンパイル時間が増加します。コンパイラはできるだけ早く失敗してdev時間を短縮したいので、この選択は論理的です。さらに、同じ理由でクラスについて明確に考えるのに役立ちます。

+2

+1最後に元気な答え。ありがとうございました。 :) – weltraumpirat

+4

私は最善を尽くす。結局のところ、私たちは一緒にこのすべてです! –

+2

@NathanielFord、本当にですか?私はひどく誤解されました。 – jn1kk

5

おそらく、コンパイラの仕事を簡単にするためです。それは単なる大会です。これらのものを並べ替えることができるという利点はありません。

なぜ、Java関数がpublic int (int a, int b)add{ return a+b; }のようなプリオーダー表記で書かれていないか尋ねるのと同じです。

+0

「C」の何か。書かれた冗長性よりも多くのコードが読まれるので、利点があります。 –

+0

慣例ではありません。これは構文規則です。あなたが無視することができる規則、規則はコンパイラによって強制されます。 –

関連する問題