3

次の Java コードが Eclipse で実行されると、正しい出力が得られます (つまり、'Class B' が出力されます) が、Java 仕様によれば、コードはコンパイルできません (スーパー クラス コンストラクターにはint引数と、によって提供されるコンストラクターが必要なため)。クラス B へのコンパイラには、定義されていないスーパー クラス no arg コンストラクタへの呼び出しが含まれており、コマンド ラインで javac コマンドを使用してファイルをコンパイルしようとすると、スーパー クラス、つまりクラス A のみがコンパイルされ、次のコンパイルで失敗します。エラー:

B.java:8: cannot find symbol
symbol  : constructor A()
location: class A
public class B extends A {
   ^
1 error

以下は、Java ファイルの内容です。

class A {

    public A(int x) {
        //
    }
}

public class B extends A {

    public static void main(String[] args) {
        System.out.println("Class b");
    }
}

biengがクラスをコンパイルできなくても、Eclipseがメインメソッドを実行する方法を誰かが説明できますか? 前もって感謝します。

アップデート

binフォルダにあるeclipseで作成した.classファイルを削除してクラスを実行しようとしたところ、コンパイルできず実行されませんでした。しかし、パブリッククラス名でソースファイルを作成し、コンテンツなしで保存してから、上記のコンテンツを追加すると、機能しました。Eclipse が以前にコンパイルされたバージョンを使用して実行する場合、完全なコンパイルが成功した時点でメソッドmainがなかったため、どのようにしてメソッドの出力を得ることができますか?main

4

3 に答える 3

5

実際、eclipseはクラスをコンパイルしようとしますが、ビルドエラーのためにコンパイルできません。以前に正常にコンパイルされた、以前にコンパイルされたクラスを実行したファイルを実行するだけです(eclipseは、名前を付けて保存するたびにファイルをコンパイルしてビルドしようとします。一般的な設定ごと)。

解決するために、実行する前にプロジェクトをクリーンアップしてみることができますが、javacの場合は、単にコンパイルします。

于 2012-05-11T06:52:57.203 に答える
2

Eclipse は、 の代わりに独自の Java コンパイラ ( と呼ばれるecj) を使用しjavacます。このコンパイラは、壊れたソース ファイルの (部分的な) コンパイルを許可します

于 2016-04-23T17:04:08.363 に答える
1

Eclipseはそうすべきではありません。あいまいな結果につながります。クラスをコンパイルできなかった場合は、対応する .class ファイルを削除する必要があります。

bin フォルダーを確認すると、B.class と A.class が存在します。B がコンパイルされないのに B.class を作成する理由がわからない

于 2012-05-11T12:53:32.037 に答える