-4

クラスAにクラスBの参照があり、クラスBにクラスAの参照がある場合、Javaで受け入れられますか? はいの場合、クラス A を実行するまでにクラス B はインスタンス化されません。では、コンパイラはクラス B の参照をどのように実行するのでしょうか?

ティア

4

3 に答える 3

7

クラスAにクラスBの参照があり、クラスBにクラスAの参照がある場合、Javaで受け入れられますか?

はい。

クラスAを実行するまでにクラスBはインスタンス化されません。では、コンパイラはクラス B の参照をどのように実行するのでしょうか?

最初に 1 つのオブジェクトを作成し、次に別のオブジェクトを作成してから循環を閉じることにより、循環参照を作成する必要があります。たとえば、このようなもの。

A a = new A();
B b = new B(a);
a.setB(b);

A(これは、クラスがメソッドで定義されていることを前提としていsetB(A)ます。サイクルを形成する方法は他にもありますが、これが最も簡単です。)


ただし、用語はすべて完全に間違っていることに注意してください。

  • クラスを「実行」しません。クラスのインスタンスをインスタンス化または作成します
  • コンパイラ (たとえばjavac) は何も「実行」しません。コードをコンパイルするだけです。
  • Java コードを実行する(つまり実行する)ものは、Java 仮想マシンです。たとえば、javaコマンドを使用する場合。

(他の IT プロフェッショナルとコミュニケーションをとる場合は、正しい Java 用語を学び、使用することが重要です。これにより、多くの誤解や混乱を避けることができます!)

于 2013-08-20T12:59:49.180 に答える
1

これはまったく問題ありません。

オブジェクト A はオブジェクト B を参照でき、オブジェクト B はオブジェクト A を参照できます。これは、ノードがグラフ全体を参照するコードのグラフでよく見られますが、グラフは多くのノードを参照します。

于 2013-08-20T12:58:46.770 に答える
0

はい、コンパイラが他のクラスへの呼び出しをメソッド名と署名として保存する限り、それは許容されます: パラメータタイプ、再びテキストとして。

私は次の恐怖さえ見ました

interface A {
    final A = new B();
}

class B implements A {
}

Java は緩やかにバインドされています。対応する実行時例外がスローされます。同じことは、別のバージョンのライブラリ jar に対してコンパイルし、API が壊れている jar で実行しています。

于 2013-08-20T13:00:37.347 に答える