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
ます。ただし、この変更は、渡された実際のオブジェクトには反映されません。c
inFoo.func()
とは現在MainClass.main()
、別のオブジェクトです。c
これが、 ofへの変更がin にFoo.func()
影響しない理由です。c
MainClass.main()