0

次のクラスを使用するJava がいくつかObjectあります (すべて同じスーパークラスの一部です)。

オブジェクトクラス 1:

Class one extends Superobject {
    int no;
    int i;
    String s;
}

オブジェクトクラス 2:

Class two extends Superobject {
    int no;
    int i;
    String s;
}

テキスト ファイルを読み取り、単語ごとにObject1 と2のコンストラクターを呼び出して、これらのオブジェクトの多くを作成したいと考えています。Object

クラスの aにすべてのObjects を格納しようとしましたが、どういうわけか、リストを非静的にすることはできません。listsuper

Class Superobject {
    int no;
    int i;
    String s;
    List<Superobject> li; // of course, when called with the
    //method below: static List<Superobject> li
    }

リストに sを追加しようとすると、作成する必要がObjectあるという eclipse の叫び声liがしますstatic

public static void somemethod(Object one[] ones) {
    for (one o : ones) {
        li.add(o);
    }
}

非静的にする方法はありますか、またはObjectsを保存するより良い方法はありますか?

4

3 に答える 3

0

非静的メソッドはクラスのインスタンスに関連付けられますが、静的メソッドはクラス自体に関連付けられます。静的メソッドから非静的メンバーにアクセスしようとしています。そのため、コンパイラは非静的メンバーをオブジェクトに関連付けることができません。

できることは、両方を静的にすることです。これSuperobjectは、リストにいくつかのインスタンスを保存しようとするときに行う必要があります。静的にしない場合、のすべてのインスタンスにSuperobjectは独自のリストがあります。または、別のクラスを作成して呼び出しSuperobjectCollection、Add、Remove、Get などのメソッドを提供して、基になるリストにアクセスすることもできます。

次の擬似コードを検討してください

class SuperobjectCollection {
private List<Superobject> list;

  public AddObj(Superobject obj) {
    list.add(obj);
  }
}

オブジェクトの追加、取得、または削除中に見られるように、任意のロジックを追加できます。

リストをクラスに保持したい場合は、リストSuperobjectを静的にして、静的メソッドを使用してアクセスする必要があります。そうしないと(提示したコードのように)、次のような状況になります。

Class Superobject {
    int no;
    int i;
    String s;
    List<Superobject> li; 
    }

次のような 2 つのインスタンスを作成する場合:

Superobject a = new one();
Superobject b = new two();

との両方aに、b別の が含まれliます。あなたsomemethodが静的でない場合は、そのメソッドでこのリストにアクセスできます

li.add();

または好き

this.li.add();

メソッドを次のように呼び出した場合、または次のように呼び出した場合のthisオブジェクトは次のとおりです。aa.somemethod()bb.somemethod()

静的メソッドはインスタンスではなくクラスに関連付けられているため、次のようにアクセスします。

Superobject.someobject();

好きじゃない

a.someobject();
于 2013-07-08T16:22:09.103 に答える
0

これはひどい設計上の決定ですが、静的メソッドのシグネチャを変更できると仮定すると、これは役に立ちます。

public static void somemethod(Object one[] ones, List<Superobject> li) {
    for (one o : ones) {
        li.add(o);
    }
}

ただし、このメソッドのシグネチャを変更できる場合は、とにかく非静的にしたいと思うでしょう。

一方、リストに要素を追加することだけを達成したい場合。次のことがうまくいかないのはなぜですか?

li.addAll(Arrays.asList(ones));
于 2013-07-09T10:30:02.960 に答える