14

文字列配列は、次の方法で宣言および初期化できます。

String[] str = {"A", "B"};

しかし、引数として文字列配列を受け入れるメソッドの場合、なぜ同じものをそこで使用できないのでしょうか。

例:以下のコードで、show()fromからへの呼び出しを置き換えると、show(str);コンパイラshow({"A" "B"});エラーが表示されます。なんで?

public class StringArray {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String[] str = {"A", "B"};
        show(str);
    }
    static void show(String[] s) {
        System.out.println(s[0] + s[1]);
    }
}

表示されるコンパイラエラーは次のとおりです。

StringArray.java:9: illegal start of expression
                show({"A", "B"});
                     ^
StringArray.java:9: ';' expected
                show({"A", "B"});
                      ^
StringArray.java:9: illegal start of expression
                show({"A", "B"});
                         ^
StringArray.java:9: ';' expected
                show({"A", "B"});
                          ^
StringArray.java:9: illegal start of type
                show({"A", "B"});
                               ^
StringArray.java:11: class, interface, or enum expected
        static void show(String[] s) {
               ^
StringArray.java:13: class, interface, or enum expected
        }
        ^
7 errors

使用show(new String[] {"A", "B"});も可能です。それらをメソッド引数として渡す場合とどうnew String[]{"A", "B"}違うのですか?{"A", "B"}よろしくお願いします!

4

8 に答える 8

12

構文{"A", "B"}(new String[]前にない) は、配列初期化式としてのみ使用できます。new他のすべてのコンテキスト (メソッド呼び出しを含む) では、演算子を使用する必要があります。

詳細については、配列に関する Java チュートリアルを参照してください。

于 2012-07-18T05:56:14.083 に答える
6

String[] str = {"A", "B"};の縮小版です。明示的に言及しない限りString[] str = new String[]{"A", "B"};、コンパイラはプレーンを文字列配列として認識しません。{"A", "B"}

于 2012-07-18T05:57:00.687 に答える
1

{"A", "B"} を渡すと、その配列はメモリ内にまだ作成されておらず、その参照を渡す必要があるため、それを参照するオブジェクトはありません。しかし、"A" のような文字列は、文字列を受け取るメソッドに (参照なしで) 直接渡すことができます。文字列は、文字列プールが維持される Java の特別なオブジェクトだからです。単純なJavaオブジェクトのような配列ではそうではありません。

于 2012-07-18T06:02:46.703 に答える
0

上記の例では、show()メソッドのシグニチャーは、呼び出し時にString参照を予期していることをコンパイラーにガイドします。したがって、show()メソッドの呼び出し中には、String型の参照変数のみを渡すことができます。一方、{"A"、 "B"}は単なる表現であり、参照ではないため、「IllegalStartofExpression」のようなコンパイルエラーが発生します。

于 2012-07-18T12:27:13.353 に答える
0

このようにするとうまくいきます

public class StringArray 
{

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        show(new String[]{"A", "B"});
    }
    static void show(String[] s)
    {
        System.out.println(s[0] + s[1]);
    }
}

実際に新しい配列「オブジェクト」を作成しているためです。逆に、{"A", "B"} は何の意味もありません。{"A", "B"} は配列オブジェクトではないため、機能しません。最初の方法は、関数に渡されるものが配列オブジェクトであることを実際に指定しているため機能します。

于 2012-07-18T05:59:03.323 に答える
0

それString[] str = {"A", "B"};が文字列の配列であると定義しているため{"A", "B"}、オブジェクトの配列もそのように定義できるため、これが文字列の配列であるとはどこにも言われていないため、コンパイラはあなたが参照している配列のタイプを知りません:)

于 2012-07-18T05:57:14.143 に答える