10

Javaが参照渡しであることを調査しましたが、次のコードを実行すると、メインメソッドで文字列がスワップされないのはなぜですか?

static void swap(String s1, String s2){
    String temp = s1;
    s1=s2;
    s2=temp;
}

public static void main(String[] args) {
    String s1 = "Hello", s2 = "world";
    swap(s1, s2);
    System.out.println(s1 + s2);
}
4

8 に答える 8

11

あなたは間違った情報源を研究しました。Javaは値渡しです。ここに、さらに学習できるソースが 1 つあります。ここから、あなたの例に似た例についての議論を見つけることができます。

于 2012-07-28T09:51:12.643 に答える
8

1.Java何よりもまず、pass by Value.(つまり、パス バイ コピー) です。

2. Not the Objectをメソッドに渡して います。reference

例えば:

public class Test{

        private String x;

            public void go(String s){

                this.x = s;

           }

         public static void main(String[] args){

                  Test t = new Test();

                  String a = new String("Bye");

                  t.go(a);


             }
      }

上記のコードは、スワップがどのように行われるかを示すためのものではなく、重要なポイントを見えるようにするためのものです。

  • go(String s)メソッドがString 型の引数「a」を Object reference variableString 型のパラメータ「s」に 渡すことによって呼び出される場合、Value / Copy によって渡される参照だけです。Object reference variable

  • で行われた変更 は、ヒープreference 上の String オブジェクトに影響しません the reference

于 2012-07-28T11:08:20.520 に答える
2

メソッドに渡されるのは、オブジェクトの参照のコピーです。したがって、参照を何度再割り当てしても、元の参照は影響を受けません。

これを試して:

static void reverse(StringBuilder builder) {
    builder.reverse();
}

public static void main(String[] args) {
    StringBuilder builder = new StringBuilder("hello");
    System.out.println(builder);
    reverse(builder);
    System.out.println(builder);
}

ただし、以下のメソッドは、渡された元のオブジェクトに違いはありません。

static void swap(StringBuilder builder) {
    builder = null;
}
于 2012-07-28T09:51:08.293 に答える
2

Java は参照を値で渡します。呼び出されるメソッドで参照を交換しても、呼び出し元には影響しません。swap文字列は不変であるため、呼び出し元に表示されるメソッドでそれらに対してできることは何もありません。

ただし、変更可能なオブジェクトを渡すと、 で行った変更がswap元のオブジェクトに反映されることがわかります。

public static void main(String[] args) {
    String a[] = {"hello", "world"};
    swap(a);
    System.out.println(a[0] + " " + a[1]);
}
static void swap(String[] a) {
    String t = a[0];
    a[0] = a[1];
    a[1] = t;
}

これが機能するのは、配列が変更可能(つまり、その状態を変更できる) であり、元のオブジェクトへの参照が呼び出される関数に (値によって) 渡されるためです。がswapその の内容を変更すると、同じオブジェクトであるため、呼び出し元の の内容も変更されますaa

于 2012-07-28T09:51:31.943 に答える
1

Java は常に参照を値で渡します。詳細については、この回答をお読みください。ただし、配列またはラッパー クラスを介して 2 つの文字列を交換できます。


編集:

@dasblinkenlight は、配列を使用して 2 つの文字列を交換する方法を示しています。ラッパー クラスの使用例を次に示します。

public class WrapperString
{
    public String text;

    public WrapperString(String text){this.text = text}

    @Override
    public String toString(){return text;}
}

public static void swap(WrapperString a, WrapperString b)
{
    String temp = a.text;
    a.text = b.text;
    b.text = temp;
}

public static void main(String[] args)
{
    WrapperString s1 = new WrapperString("Hello");
    WrapperString s2 = new WrapperString("World");

    swap(s1, s2);
    System.out.println(s1.text + s2.text);
    // or System.out.println(s1 + s2); since we've already overridden toString()
}

出力:

WorldHello
于 2012-07-28T09:55:20.763 に答える
0
public static void swap(SwapDate[] t)
    {
     SwapDate temp;;
      temp=t[0];
       t[0]=t[1];
       t[1]=temp;
    }




       public static void main(String args[])throws Exception{

          SwapDate t[]=new SwapDate[5];
           t[0]=new SwapDate(20,8,2015);
           t[1]=new SwapDate(8,8,2015);

           System.out.println("(First object)Account Opnening date :"+" "+t[0].date);
           System.out.println("(second object)Account Opnening date :"+" "+t[1].date);


           swap(t);
           System.out.println("After Swap");

           System.out.println("(First object)Account Opnening date :"+" "+t[0].date);
           System.out.println("(second object)Account Opnening date :"+" "+t[1].date);


           }
于 2015-06-03T11:16:17.710 に答える
-2

オブジェクトを交換できます。とてもシンプルです。1 つのダミー オブジェクトを使用して 2 つのオブジェクトを交換するだけです。

以下に例を示します。

    Employee e1=new Employee();
    Employee e2=new Employee();
    e1.setName("e1");
    e2.setName("e2");   
    System.out.println(e1);
    System.out.println(e2);
    Employee temp= new Employee();
    temp=e1;
    e1=e2;
    e2=temp;
于 2014-04-13T19:39:33.253 に答える