4

私はかなり大規模なプログラムに取り組んでおり、クラスを分割する時が来たと考えました。GUI コード用の .java ファイル 1 つと、GUI が提供する機能の背後にあるメカニズム用の .java ファイル 1 つ。しかし、これが私の問題です。各クラスのインスタンスを相互に作成しましたが、プログラムは起動を拒否するため、明らかに何か間違っています。私のRPGクラスには、次のコード行があります。

public Mechanics mechanics = new Mechanics();

私のMechanicsクラスには、次のコードがあります。

public RPG rpg = new RPG();

これを試すためにこの WAS を実行している理由: 多くの変数がRPGクラスにあり、それらを my から呼び出してrpg操作し、それらをに送り返すことができるようにしRPGたいこの関数をテストします(私のMechanicsクラスから):

class Mechanics{
public RPG rpg = new RPG();
  public Mechanics(){
  }
  public void helloWorld(){
    System.out.println("Hello World!");
    System.out.println("Health before:"+rpg.Health);
    rpg.Health = rpg.Health - 5;
    System.out.println("Health after:"+rpg.Health);
  }
 }

はい、私のクラスHealthのパブリックです。intRPG

そして私のRPGクラスでは、これは私がクラスをテストするために使用しているコードですMechanics:

mechanics.helloWorld();

ここに私の問題があります: コードはコンパイルされますが、実行しようとすると、次のエラーが発生します:

 at Mechanics.<init>(Mechanics.java:15)
 at RPG.<init>(RPG.java:127)

ここに画像の説明を入力 これが私の質問です。私はこれを正しくやっていますか?プログラムを実行したくないコードの何が問題なのですか?

追加:他のクラスも呼び出してみましたがprivate、プログラムはコンパイルされますが、それでも起動を拒否し、同じエラーが表示されます

の 15 行目Mechanics:

public RPG rpg = new RPG();

の 127 行目RPG:

public Mechanics mechanics = new Mechanics();
4

4 に答える 4

4

の 15 行目は次のMechanicsようになります。

public RPG rpg = new RPG(this); // must be in constructor or non static method

RPG の場合:

public Mechanics mechanics;

コンストラクターで:

this.mechanics = mechanics;
于 2013-05-21T10:32:01.840 に答える
2

RPG または Mechanics のインスタンスを初期化するときに、無限ループを生成しています。オブジェクト指向プログラミングは、関心の分離と低結合を意味します。クラスの依存関係を変更して、一方だけが他方を必要とするようにします。

于 2013-05-21T10:26:53.017 に答える
1

「各クラスのインスタンスを相互に作成しました」

これはあなたの問題です。最終的な結果は次のとおりです。

クラス A が構築され、その中にクラス B があり、新しいクラス B が作成される
クラス B が構築され、その中にクラス A があり、新しいクラス A が作成される
クラス A が構築され、その中にクラス B がある、それは新しいクラス B を作成します
クラス B が構築され、その中にクラス A があり、新しいクラス A が作成されます
クラス A が構築され、その中にクラス B があり、新しいクラス B が作成されます
クラス B が構築されます。その中にクラス A があり、新しいクラス A を作成します

などなど永遠に、プログラムがクラッシュするまでどんどん深くなっていきます。

(理想的ではないかもしれませんが)への参照とへの参照class A持つことに(恐ろしいほど) 問題はありませんが、カプセル化とカプセル化にはひどく問題があります。両方が相互に参照している場合、一方または両方への参照が一方または両方のコンストラクターに渡されるため、キーワードは使用されません (可能であればこれも避けてください)。class Bclass Bclass Aclass Aclass Bclass Bclass Anew

私がよく (罪悪感を持って) 使用する例は次のとおりです。

public class OwnerClass {
    SubordinateClass subOrdinate;

    public OwnerClass(){
        subOrdinate=new SubordinateClass(this);
    }

}

public class SubordinateClass {
    OwnerClass owner;

    public SubordinateClass(OwnerClass owner){
        this.owner=owner;
    }
}

免責事項:これを良い習慣として提示しているわけではありません、クラスAがクラスBと通信しなければならないと仮定すると、これはそれを達成します

于 2013-05-21T10:27:20.020 に答える