0

コード:

class AB{
    int i=5;
}

class BC{
    public void test(AB a){
        a.i=10;
    }

}

public class ATest{

public static void main(String aa[]){
    AB a = new AB();
    //Base class variable value
    System.out.println(a.i);

    BC b = new BC();
    //Modifying the object "a"
    b.test(a);
    //Printing the base class object
    System.out.println(a.i);
}
}

// Output : 5
//          10

値渡しの場合、出力は 5 と 5 になるはずです

4

4 に答える 4

2

Java は値渡しを使用しますが、パラメーターがオブジェクトの場合、Java はオブジェクトへの参照を値渡しするため、呼び出されたメソッドはオブジェクト全体ではなく、オブジェクトの内容を変更できます。

これは、オブジェクトが参照によって渡されるという意味ではありません (Joachim Isaksson のコメントは間違っています)。

Arijeet Saha によるコメントへの回答に追加:

「呼び出されたメソッドは、オブジェクト全体ではなく、オブジェクトのコンテンツを変更できる」と言うとき、オブジェクト全体を変更しても、呼び出し元には変更が表示されないことを意味します。

次の例を検討してください。

public void test(Person p) {
    p.setName("Pino");
    p = new Person();
    p.setName("John");
}

1 行test()目はメソッドが受け取るオブジェクトの内容を変更し、2 行目はオブジェクト全体を変更 (新しいオブジェクトを仮パラメーターに割り当てます)、3 行目は新しいオブジェクトの内容を変更します。この場合、呼び出し元Personには「John」ではなく「Pino」という名前のオブジェクトがtest()表示されます。オブジェクトは参照によって渡されないため、表示されません。

于 2013-04-06T17:51:44.860 に答える
1

まず、値渡しとはどういう意味ですか?

これは、メソッドに何を渡しても、実際のアドレスではなくそのコピーを受け取ることを意味します。

したがって、あなたの場合も変数 a に値を渡し、その値 (オブジェクトへの参照またはオブジェクトへのアドレス) がメソッド (AB a) にコピーされます。

于 2013-04-06T18:08:00.180 に答える
0

Java は常にパラメーターをとして渡します。

値とは何か (変数が保持するもの) を理解することが重要です。

プリミティブの場合、それは値そのものです。

オブジェクトの場合は参照です。

オブジェクトをパラメーターとして渡すと、オブジェクトへの参照はコピーされますが、元のオブジェクトを指しています。

于 2013-04-06T18:13:05.963 に答える
0

Java のパラメーターの受け渡しは非常に複雑です。オブジェクトが関数に渡されると、オブジェクトのフィールドを操作できますが、オブジェクト自体を操作することはできません。オブジェクト参照は値渡しです。したがって、次のように言えます。

class someClass{
  int i = 5;
}

class Foo
{
  static void func(someClass c)
  {
     c.i = 3;
  }
} 

class MainClass{
  public static void main(){
    someClass c = new someClass();
    System.out.println(c.i);
    Foo.func(c);
    System.out.println(c.i);
  }
}

出力が次のようになることを期待してください。

5
3

c のフィールドへの変更は持続します。

Foo.func()ただし、オブジェクト自体を操作する場合、この操作はその関数の外部ではなく、その関数内でのみ持続します。

class someClass{
  int i = 5;
}

class Foo
{
  static void func(someClass c)
  {
     c.i = new someClass();
     c.i = 3;
     System.out.println(c.i);
  }
}

class MainClass{
  public static void main(){
    someClass c = new someClass();
    System.out.println(c.i);
    Foo.func(c);
    System.out.println(c.i);
  }
}

出力が次のようになることを期待してください。

5
3
5

何が起きたの?ci の値はMainClass.main()in で5Foo.func()です。c 自体は、値 3 を含む の別のインスタンスを指すように変更されsomeClassます。ただし、この変更は、渡された実際のオブジェクトには反映されません。cinFoo.func()とは現在MainClass.main()、別のオブジェクトです。cこれが、 ofへの変更がin にFoo.func()影響しない理由です。cMainClass.main()

于 2013-04-06T17:54:09.510 に答える