0

申し訳ありませんが、Javaを初めて使用するC++プログラマーが再びストライキを行います

私はこのコードを持っています

public class MainView extends View {

    static final int DRAW_LIST_SIZE=100;
    class EventDrawStuff {
        int         a;
        int         b;
        int         c;
    }
    static EventDrawStuff   m_drawList[] = new EventDrawStuff[DRAW_LIST_SIZE];

    class DrumEventDrawStuff {
        int     x;
        int     y;
    } 
    static DrumEventDrawStuff m_eventDrawStuff = new DrumEventDrawStuff();

m_drawListの宣言は問題なく機能しているようですが、m_eventDrawStuffの宣言はコンパイルされません。違いは何ですか、m_drawListが配列であるというだけではいけませんか?私が言うなら私は気づきます

static DrumEventDrawStuff[] m_eventDrawStuff = new DrumEventDrawStuff[1];

それは大丈夫ですが、それはたった1つのものなので、実際には1つの配列にしたくありません。元のコードを修正する方法は、コンストラクターでm_eventDrawStuffを初期化することですが、それは面倒で不必要に思えます。

たぶん私は完全に間違った考えを持っています、私に教えてください、ありがとう

4

3 に答える 3

1

あなたは2つの方法でそれを行うことができます-

  1. 内部クラスを静的にする

  2. DrumEventDrawStuffオブジェクトの助けを借りてオブジェクトを作成しMainViewます。

    static DrumEventDrawStuff m_eventDrawStuff = new MainView().new DrumEventDrawStuff();

于 2013-01-11T07:18:26.587 に答える
1

問題はDrumEventDrawStuff、静的コンテキストで a をインスタンス化しようとしていることです。DrumEventDrawStuffは の内部クラスですMainView。これは、 の各インスタンスが、それを保持DrumEventDrawStuffする のインスタンスへの暗黙的な参照MainView(「外側の this」) を持っていることを意味します。

静的クラスを作成DrumEventDrawStuffすると、暗黙のアウターが削除されるため、問題ありませんthis

static class DrumEventDrawStuff {
    ...
}

EventDrawStuffこの時点で、なぜ非静的クラスを静的コンテキストで使用できるのか疑問に思われることでしょう。

答えは、配列を作成するときに実際にはインスタンスを作成していないということです。EventDrawStuffC++ とは異なり、Java は新しい配列を作成するときにオブジェクトをインスタンス化しません。EventDrawStuffしたがって、 null 値で満たされるため、配列を静的に宣言して作成してもまったく問題ありません。

于 2013-01-11T07:22:54.093 に答える
0

ここでは、DrumEventDrawStuff は非静的な内部クラスであるため、MainView の「周囲の」インスタンスが必要です。それがなければ、インスタンス化できません。

あなたの配列、m_drawList は EventDrawStuff のインスタンスのない配列のみです。それ以外の場合は同じ問題がありました。

これらの静的フィールドが本当に必要な場合は、クラスを静的にする必要があるため、周囲のインスタンスは必要ありません。

public class MainView extends View {

static final int DRAW_LIST_SIZE=100;
static class EventDrawStuff {
    int         a;
    int         b;
    int         c;
}
static EventDrawStuff   m_drawList[] = new EventDrawStuff[DRAW_LIST_SIZE];

static class DrumEventDrawStuff {
    int     x;
    int     y;
} 
static DrumEventDrawStuff m_eventDrawStuff = new DrumEventDrawStuff();
于 2013-01-11T07:21:01.313 に答える