Trong Java chỉ có truyền tham trị, không truyền tham trị tham chiếu. Điều này có nghĩa là một bản sao của biến được tạo ra và phương thức nhận bản sao đó. Các nhiệm vụ được thực hiện trong phương thức không ảnh hưởng đến đối tượng gọi.
Ví dụ 1
Ví dụ chúng ta gọi một phương thức và truyền một giá trị cho phương thức đó, việc thay đổi giá trị chỉ có hiệu lực trong phương thức được gọi, không có hiệu lực bên ngoài phương thức.
package com.gpcoder;
public class Operation {
public static void main(String[] args) {
int num = 4;
change(num); // passing value
System.out.println(num); // Output: 4
}
public static void change(int num) {
num = 8; // changes will be in the local variable only
}
}
Trong ví dụ trên, chúng ta gọi phương thức change() và truyền giá trị data = 4. Phương thức change() thay đổi giá trị data, nhưng nó chỉ thay đổi giá trị biến local bên trong phương thức này, không làm thay đổi giá trị data bên trong main().
Ví dụ 2
Ví dụ gọi một phương thức và truyền một giá trị tham chiếu đến một đối tượng, việc thay đổi giá trị của đối tượng được tham chiếu bên trong phương thức làm thay đổi giá trị đối tượng gốc của nó, nhưng giá trị tham chiếu được truyền vào param vẫn không đổi.
class Operation {
int data = 50;
void change(Operation op) {
op.data = op.data + 100;// changes will be in the instance variable
}
public static void main(String args[]) {
Operation op = new Operation();
System.out.println("Before change " + op.data + ". Reference = " + op);
op.change(op); // passing object
System.out.println("After change " + op.data + ". Reference = " + op);
}
}
Kết quả:
Before change 50. Ref = com.gpcoder.Operation@26ba2a48 After change 150. Ref = com.gpcoder.Operation@26ba2a48
Như bạn thấy, giá trị param được truyền vào phương thức vẫn không đổi (26ba2a48), mọi thay đổi chỉ ảnh hưởng trên đối tượng được tham chiếu.
Để hiểu rõ hơn, các bạn tham khảo bài viết này: “Quản lý bộ nhớ trong Java với Heap Space vs Stack“