6

こんにちは私は私のscja試験のために勉強していて、ref/valueを通過する文字列とそれらがどのように不変であるかについて質問があります。次のコードは「abcabcfg」を出力します。

私が知りたいのは、なぜこれが起こっているのかということです。メソッドfの内部で何が起こっているのか理解できません。文字列は値で渡されるので、メソッド内で「abcde」に変更する必要がありますか?b + = "fg"が文字列に追加された場合、メソッド内で機能しないのはなぜですか?

ありがとう!

public class Test {

    public static void main(String[] args){
        String a =new String("abc");
        String b = a;
        f(b);
        b+="fg"
        System.out.println(a + " " + b);
    }

    public static void f(String b){
        b+="de";
        b=null;
    }
}
4

5 に答える 5

8

関数の行b+="de";は、関数のオブジェクトに影響を与えないvoid f(String b)完全に新しいオブジェクトを作成します。Stringmain

つまり、オブジェクトに変更を加えると完全に新しいオブジェクトが作成されるという意味String不変であると言う場合StringString

public class Test {
    public static void main(String[] args){
        String a =new String("abc");

        String b = a; // both a & b points to the same memory address

        f(b); // has no effect

        // b still has the value of "abc"
        b+="fg" // a new String object that points to different location than "a"

        System.out.println(a + " " + b); // should print "abc abcfg" 
    }

 public static void f(String b){
    b+="de";  // creates a new object that does not affect "b" variable in main
    b=null;
 }
}
于 2013-02-17T00:01:33.090 に答える
3

メソッドf()では、パラメーターに新しい文字列を割り当ててbいますが、パラメーターはローカル変数と同じであるため、パラメーターに何かを割り当てても、メソッドの外部には何の影響もありません。そのため、渡した文字列はメソッド呼び出し後も変更されません。

于 2013-02-17T00:00:20.093 に答える
3

このコード行:

b += "de";

大まかに次のように解釈されます。

b = b + "de";

これにより、新しい文字列が作成され、ローカル変数「b」に格納されます。メソッド外の参照は、これによってとにかく変更されません。これがこのように機能する方法/理由を理解しようとするときに覚えておくべき重要なことがいくつかあります。

  1. Javaでは、すべてのメソッド引数は値で渡されます。
  2. メソッドには、メソッド引数を含むすべてのデータが格納されるローカルスタックがあります。

メソッドに渡された変数に新しいオブジェクトを割り当てる場合、ローカルスタック内のアドレスを、作成された新しいオブジェクトのアドレスに置き換えるだけです。メソッド外の実際のオブジェクトアドレスは同じままです。

于 2013-02-17T00:02:06.460 に答える
0

Stringをメソッドに渡すと、メソッドに新しいStringオブジェクトが作成されます。次のように、メソッドにprintlnステートメントを配置すると、次のようになります。

public static void f(String b){
    b+="de";
    System.out.println(b);
    b=null;
}

出力「abcde」が表示されます。

ただし、メソッドを終了すると、変更されていない元のオブジェクトに戻ります。したがって、fgを追加すると、「abcfg」を含む新しい文字列(b)のみが生成されます。

于 2013-02-17T00:01:10.963 に答える
0

b + = "de"のように言うと、Stringの新しいオブジェクトを作成します

b = new String(b + "de");と言っているようなものです。

渡された値を本当に保持したい場合は、次のようなstringBuilderを使用してください。

    StringBuilder a =new StringBuilder("abc");
        StringBuilder b = a;
        f(b);
        b.append("fg");
        System.out.println(a + " " + b);
    }

  public static void f(StringBuilder b){
        b.append("de");
        b=null;
    }

これで、stringbuilderオブジェクトbがオブジェクト自体の値としてfに渡されたため、出力は「abcdefg」になります。別のオブジェクトを指すために「new」を使用せずに値を変更しました。今それが明確になることを願っています。

于 2016-10-05T20:04:33.273 に答える