Java luôn chuyển đối số theo giá trị NOT theo tham chiếu.
Hãy để tôi giải thích điều này thông qua một example:
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");
}
}
tôi sẽ giải thích điều này trong các bước:
Tuyên bố một tài liệu tham khảo tên f
loại Foo
và gán nó vào một mới đối tượng thuộc loại Foo
với thuộc tính "f"
.
Foo f = new Foo("f");
Từ phía phương pháp, một tài liệu tham khảo của loại Foo
với một tên a
được khai báo và nó ban đầu được giao cho null
.
public static void changeReference(Foo a)
Như bạn gọi phương thức changeReference
, tài liệu tham khảo a
sẽ được giao cho các đối tượng được thông qua như là một cuộc tranh cãi.
changeReference(f);
Tuyên bố một tài liệu tham khảo tên b
loại Foo
và gán nó vào một đối tượng mới của loại Foo
với một thuộc tính "b"
.
Foo b = new Foo("b");
a = b
được tái gán tham chiếu a
KHÔNG f
đến đối tượng có thuộc tính của nó là "b"
.
Như bạn gọi modifyReference(Foo c)
phương pháp, một tham chiếu c
được tạo ra và gán cho đối tượng với thuộc tính "f"
.
c.setAttribute("c");
sẽ thay đổi các thuộc tính của đối tượng tham chiếu c
điểm với nó, và nó cùng một đối tượng tham chiếu f
điểm đến nó.
Tôi hy vọng bạn hiểu bây giờ như thế nào đi qua đối tượng như các đối số làm việc trong Java :)
Nguồn
2012-02-22 23:11:57
Không có "chuyển bằng tham chiếu" ở đó. Nó vượt qua bởi giá trị, và giá trị là một tham chiếu. Mã B không biên dịch, và nếu nó sẽ không thay đổi myFoo. – harold