3

重複の可能性:
Java は参照渡しですか?
Java 参照渡し

a次の Java プログラムについては、C/C++ のポインター型のように、整数への参照型であると理解しています。したがって、メソッドfでその値に対して行われた変更は、メソッドが戻った後に反映されます。ただし、3 ではなくprintln元の値が出力されます。0

Integer違いはありintません。私の以前の理解は間違っていましたか?助けてください。ありがとうございました!

  public static void f(Integer b){
            b=3;
        }
        public static void main(String[] args){
            Integer a=0;
            f(a);
            System.out.println(a);
      }
4

6 に答える 6

4

Java は常に、引数を参照ではなく値で渡します。


を通してこれを説明しましょう:

public class Main
{
     public static void main(String[] args)
     {
          Foo f = new Foo("f");
          changeReference(f); // It won't change the reference!
          modifyReference(f); // It will modify the object that the reference variable "f" refers to!
     }
     public static void changeReference(Foo a)
     {
          Foo b = new Foo("b");
          a = b;
     }
     public static void modifyReference(Foo c)
     {
          c.setAttribute("c");
     }
}

これを段階的に説明します:

  1. ftypeという名前の参照を宣言し、それをattribute を持つFootype の新しいオブジェクトに割り当てます。Foo"f"

    Foo f = new Foo("f");
    

    ここに画像の説明を入力

  2. メソッド側からはFoo、名前付きの型の参照aが宣言され、最初に に割り当てられnullます。

    public static void changeReference(Foo a)
    

    ここに画像の説明を入力

  3. メソッドを呼び出すと、引数として渡されたオブジェクトchangeReferenceに参照aが割り当てられます。

    changeReference(f);
    

    ここに画像の説明を入力

  4. btypeという名前の参照を宣言し、それをattribute を持つFootype の新しいオブジェクトに割り当てます。Foo"b"

    Foo b = new Foo("b");
    

    ここに画像の説明を入力

  5. a = b属性が であるオブジェクトへの参照aNOTを再割り当てしています。f"b"

    ここに画像の説明を入力


  6. メソッドを呼び出すmodifyReference(Foo c)と、参照cが作成され、属性を持つオブジェクトに割り当てられます"f"

    ここに画像の説明を入力

  7. c.setAttribute("c");参照が指すオブジェクトの属性を変更し、参照がc指すのと同じオブジェクトですf

    ここに画像の説明を入力

オブジェクトを引数として渡す方法がJavaでどのように機能するかを理解していただければ幸いです:)

于 2012-05-29T23:54:03.467 に答える
2

メソッドは参照のコピーを受け取ります。割り当ては、整数が表す値を変更しません (変更したくても変更できませんでした - IntegerJava では不変です)。b他の何かを指すように設定しているだけです。指している元のIntegerオブジェクトは、この変更の影響を受けません。a

b = 3;

------    ------
|  a |    |  b |
------    ------
  |          |
  ------------
        |
   Integer(0)

b = 3;

------    ------
|  a |    |  b |
------    ------
  |          |
  |          |
  |          |
Integer(0)  Integer(3)

値を変更したい場合は、代わりに可変型を使用する必要があります。

関連している

于 2012-05-29T23:50:02.863 に答える
2

Integer(他の「基本」クラスと同様) は不変オブジェクトです。これは、値を変更できる方法がないことを意味します。もしあなたがそうするなら

 new Integer(1);

作成されたオブジェクトは常に 1 の値を保持します。

もちろんできます

Integer a = new Integer(1);
a = new Integer(2);

しかし、ここでは 2 つのオブジェクトを作成し、それぞれに a を順番に割り当てています。

メソッドを呼び出すとき、(edalorzo が言ったように) で参照のコピーを渡しているaので、ほとんど同じことをしています (ただし、元のa参照は変更していません)。

もちろん、多くのクラスは不変ではありません。これらのクラスには、オブジェクトの内部状態を変更できる 1 つ (または複数) のメソッドがあり、(同じオブジェクトにアクセスしている限り) これらの変更は、オブジェクトのすべての参照によって「共有」されます (それらはすべて同じものを指しているため)。たとえば、Integer にsetValue(int)メソッドがあるとします。

public static void f(Integer b){      
        b.setValue(3);      
    }      
    public static void main(String[] args){      
        Integer a=0;      
        f(a);      
        System.out.println(a);      
  }    

あなたが期待したように動作します。

于 2012-05-29T23:53:33.963 に答える
1

整数は不変であるため、参照渡しは期待どおりに機能しません。Javaを参照してください: int を参照渡しする最良の方法

于 2012-05-29T23:49:20.020 に答える
0

Java ではすべてがコピー渡しであり、メソッドでは参照をチェーンしていて、それが指している実際のオブジェクトではありません。

于 2012-05-29T23:46:20.340 に答える
0

あなたの理解は正しかったですが、整数は不変です。Integer 変数の値に影響を与えたい場合、唯一の方法は、新しい Integer オブジェクトを作成し、古いオブジェクトを破棄することです。このため、このステートメントb=3は無効です。

于 2012-05-29T23:50:17.183 に答える