0

以下に示すコードのサンプルでは、​​「new」キーワードを使用して文字列配列をインスタンス化しています。ただし、インスタンス化はオブジェクト専用ですが、c[] 配列は静的であるため、これを行うのは間違っていますか? これを行う別の方法はありますか、それともオブジェクトのようにインスタンス化するために「new」を使用する必要がありますか?

public class SmallTank {

static String tableString = " ";

static String c[];
static String d[];
static String p;

public SmallTank(){

    c = new String[66];
    d = new String[29];

    // initialize string array
    for(int v = 0; v<66; v++ ){
        c[v] = null; 
    }
4

8 に答える 8

0

static 修飾子の意味は次のとおりです。

「静的」メソッドまたはフィールドは、クラス定義の外で宣言されているかのように考えることができます。言い換えると

静的フィールド/メソッドの「コピー」は 1 つだけです。静的フィールド/メソッドは、非静的フィールド/メソッドにアクセスできません。

だからあなたが望むものは次のとおりです:

static String c[] = new String[66];
static String d[] = new String[29];
于 2013-07-02T06:34:57.203 に答える
0

あなたのアプローチの問題は、SmallTank のインスタンスを作成するたびに配列が初期化されることです。おそらくこれはあなたが望むものですが、通常は静的初期化子が正しいアプローチです:

public class SmallTank {

    static String tableString = " ";

    static String c[] = new String[66];
    static String d[] = new String[29];
    static String p;

    static {
        // initialize string array
        for(int v = 0; v<66; v++ ){
            c[v] = null; 
        }

これにより、クラスが最初にロードされるとき、通常は最初にインスタンスを作成するときに、配列が一度初期化されます。

他の人が指摘したように、null への初期化は無意味です。

于 2013-07-02T06:34:57.073 に答える
0

コンストラクターではなく、配列を宣言するときに配列を初期化します。

public class SmallTank {
    static String c[] = new String[66];
    static String d[] = new String[99];
...
}

コンストラクターでこれを行うことは合法ですが、静的フィールドを使用するポイントは、インスタンス間で共有することです。あなたの場合、の新しいインスタンスを作成するたびに配列がリセットされますSmallTank

于 2013-07-02T06:35:24.023 に答える
0

このコードは必要ありません。c[v] = null;デフォルトでは、参照配列のすべての要素はnull. Array は object であるため、 を使用newしてインスタンス化します。コンストラクター内で実行しないでください。宣言した場所で直接インスタンス化できます。

static String c[] = new String[66];

これにより、静的配列オブジェクトが作成されるため、クラスのすべてのインスタンスがこのオブジェクトを共有します。他の方法でも配列を作成できます。

static String[] c = {"a","b","c"};
static String[] c = new String[]{"a","b","c"};
于 2013-07-02T06:31:27.487 に答える
0

あなたの配列はオブジェクトです。したがって、それらは で作成されnewます。

このオブジェクトへの参照のみが、キーワードclassによって にバインドされます。static

于 2013-07-02T06:31:41.993 に答える
0

配列はオブジェクトです。objectc同様であり、静的であってもそれは変わりません。

ただし、それが意味することは、 will のすべてのオブジェクトSmallTankが結局上書きcされてしまうということdです。

あなたが望むのはstatic initializationを行うことだと思います。

追加

static {
    c = new String[66];
    d = new String[29];

    // initialize string array
    for(int v = 0; v<66; v++ ){
        c[v] = null; 
    }
}

そして、それらの呼び出しをコンストラクターから削除します。

これは初期化さcれ、d一度だけ実行されます。

于 2013-07-02T06:31:48.927 に答える
0

Java では、everyarrayobject. 配列が静的参照であることは問題ではありません。初期化の目的で、静的初期化ブロックを使用できます

  static {

        c = new String[66];
        d = new String[29];

        }

クラスがメモリにロードされるときに、最初に 1 回だけロードされます。

于 2013-07-02T06:33:30.927 に答える