30/09/2018, 19:42

Hỏi về bản chất tham chiếu trong java

Như em được biết thì với kiểu dữ liệu tham chiếu thực ra là truyền bản sao của tham chiếu gốc, chứ
không phải truyền tham chiếu gốc hoặc truyền đối tượng (pass the references by value, not the original
reference or the object). Nhưng em vẫn không hiểu đầu ra của phương thức này?

public void tricky(Point arg1, Point arg2)
{
arg1.x = 100;
arg1.y = 100;
Point temp = arg1;
arg1 = arg2;
arg2 = temp;
}
public static void main(String [] args)
{
Point pnt1 = new Point(0,0);
Point pnt2 = new Point(0,0);
System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);
System.out.println(“X: " + pnt2.x + " Y: " +pnt2.y);
System.out.println(” ");
tricky(pnt1,pnt2);
System.out.println(“X: " + pnt1.x + " Y:” + pnt1.y);
System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
}

Ở phương thức tricky() thì Point temp() = arg1; arg1=arg2; theo em được biết thì với kiểu khai báo trên giá trị của temp phải thay đổi theo arg1 ( đúng không ạ?)
Em đọc giải thích trên JavaWorld nhưng không hiểu lắm:
Trong phương thức main ( ), pnt1 và pnt2 là không hơn gì tham chiếu đối tượng. khi khai báo pnt1 và pnt2 đến tricky( ), java truyền tham trị giống như bất kỳ thông số khác. này có nghĩa là kiểu truyền tham chiếu thực ra chỉ là bản sao của tham chiếu gốc.
Ai có thể giải thích kĩ hơn cho em về tham chiếu trong java được không ạ? Nếu chỉ là bản sao thì tại sao đầu ra pnt1 vẫn có giá trị x = 100 y =100 ạ?

vũ xuân quân viết 21:58 ngày 30/09/2018

Đọc giải thích link dưới thì sẽ hiểu

JavaWorld

Does Java pass by reference or pass by value?

If Java uses the pass-by reference, why won't a swap function work?

public void tricky(Point arg1, Point arg2)
{
  arg1.x = 100; // 1.a
  arg1.y = 100; // 1.b
  Point temp = arg1; // 2
  arg1 = arg2; // 3
  arg2 = temp; // 4
}

passes the references by value (chuyền tham chiếu giá trị)
ở đây khi chuyền vào hàm tricky thì java sẽ tạo ra 1 object khác cùng tham khảo(địa chỉ vùng nhớ) đến object gốc. ở đây là arg1 tham khảo cùng vùn nhớ với object pnt1 và arg2 tham khảo cùng vùn nhớ với object pnt2 .

tới 1.a và 1.b thì giá trị của arg1 thay đổi từ 0 thành 100 thì object pnt1 thay đổi giá trị theo.

tới bước 2 thì object temp(bản sao) tham khảo đến vùng nhớ arg1
tới bước 3 thì object arg1 tham khảo đến vùng nhớ arg2
tới bước 3 thì object arg2 tham khảo đến vùng nhớ temp

objec pnt2 không thay đổi giá trị.
object arg2 thay đổi địa chỉ vùng nhớ từ pnt2 sang pnt1
object arg1 thay đổi địa chỉ vùng nhớ từ pnt1 sang pnt2

không biết có hiểu không ???

Kgt viết 21:43 ngày 30/09/2018

Bạn coi Java có 2 kiểu là primitive/scalar (tức là kiểu int, float, double trong java) và kiểu reference. Kiểu reference chính là tham chiếu đến object hay nó là địa chỉ của object, tức là 1 số nguyên 4 byte hoặc 8 byte tùy máy 32 bit hay 64 bit.

2 tham số truyền vào hàm static tricky() là 2 reference. 1a, 1b là bạn đang thay đổi gía trị của reference (value của ref). Còn từ dòng 2 đến 4 là bạn cố gắng thay đổi bản thân reference, tức là thay đổi 2 số nguyên, tức là thay đổi primitive/scalar.

Bạn muốn hiểu hơn về reference bạn cần implement con trỏ (pointer), tức là học về C/C++, Delphi, Pascal…

Newbie viết 21:53 ngày 30/09/2018

Vâng cảm ơn hai người em hiểu sơ sơ cách hoạt động rồi ạ

Newbie viết 21:56 ngày 30/09/2018

Việc gán giá trị ở 1.a và 1.b làm thay đổi giá trị của tham chiếu gốc, còn các lệnh ở 2-4 chỉ là gán giá trị bằng việc thay đổi địa chỉ tham chiếu đúng không ạ?

Bài liên quan
0