Tham số của phương thức là những biến được khai báo trong khai báo phương thức. Tham số đóng vai trò là giá trị đầu vào cho phương thức.
Trong Java, có 2 cách để truyền tham số cho phương thức:
- Tham trị (pass by value)
- Tham chiếu (pass by reference)
Lưu ý: Ngôn ngữ Java không có khái niệm con trỏ (pointer) như trong C++ để tránh các trường hợp không kiểm soát tốt việc truy xuất trực tiếp đến bộ nhớ dẫn đến gây lỗi chương trình. Điều này cũng giúp lập trình viên cảm thấy Java dễ hiểu, dễ học hơn C++. Và do Java không hỗ trợ con trỏ nên không có cách truyền địa chỉ cho phương thức như trong C++.
1. Truyền tham trị trong Java
Trong Java, khi gọi một phương thức và truyền một giá trị cho phương thức, được gọi là truyền tham trị. 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.
Trong Java, truyền tham trị dành cho các tham số có kiểu dữ liệu nguyên thủy là byte, short, int, long, float, double, boolean, char.
Ví dụ:
class Main {
/*Hoán đổi 2 biến*/
public static void swap(int n1, int n2) {
System.out.println("\tGia tri cac bien ben trong ham swap");
System.out.println("\t\tTruoc khi swap, n1 = " + n1 + " va n2 = " + n2);
// Swap n1 with n2
int temp = n1;
n1 = n2;
n2 = temp;
System.out.println("\t\tSau khi swap, n1 = " + n1 + " va n2 = " + n2);
}
public static void main(String[] args) {
int num1 = 1;
int num2 = 2;
System.out.println("Truoc khi goi ham swap, num1 = " + num1 + " va num2 = " + num2);
swap(num1, num2);
System.out.println("Sau khi goi ham swap, num1 = " + num1 + " va num2 = " + num2);
}
}
Kết quả
Truoc khi goi ham swap, num1 = 1 va num2 = 2
Gia tri cac bien ben trong ham swap
Truoc khi swap, n1 = 1 va n2 = 2
Sau khi swap, n1 = 2 va n2 = 1
Sau khi goi ham swap, num1 = 1 va num2 = 2
Rõ ràng, các số num1 và num2 chỉ thay đổi trong hàm swap
. Sau khi ra khỏi hàm swap
thì giá trị num1 và num2 hoàn toàn không thay đổi.
2. Truyền tham chiếu trong Java
Trong Java, khi gọi một phương thức và truyền một tham chiếu cho phương thức, được gọi là truyền tham chiếu. Việc thay đổi giá trị của biến tham chiếu bên trong phương thức làm thay đổi giá trị của nó.
Trong Java, tất các phương thức có tham số là biến có kiểu là các lớp (class) đều là kiểu tham chiếu.
Ví dụ:
class Main {
int data;
Main(int dataValue){
data = dataValue;
}
/*Hoán đổi 2 biến*/
public static void swap(Main n1, Main n2) {
System.out.println("\tGia tri cac bien ben trong ham swap");
System.out.println("\t\tTruoc khi swap, n1.data = " + n1.data + " va n2.data = " + n2.data);
// Swap n1.data with n2.data
int temp = n1.data;
n1.data = n2.data;
n2.data = temp;
System.out.println("\t\tSau khi swap, n1.data = " + n1.data + " va n2.data = " + n2.data);
}
public static void main(String[] args) {
Main n1 = new Main(1);
Main n2 = new Main(2);
System.out.println("Truoc khi goi ham swap, n1.data = " + n1.data + " va n2.data = " + n2.data);
swap(n1, n2);
System.out.println("Sau khi goi ham swap, n1.data = " + n1.data + " va n2.data = " + n2.data);
}
}
Kết quả
Truoc khi goi ham swap, n1.data = 1 va n2.data = 2
Gia tri cac bien ben trong ham swap
Truoc khi swap, n1.data = 1 va n2.data = 2
Sau khi swap, n1.data = 2 va n2.data = 1
Sau khi goi ham swap, n1.data = 2 va n2.data = 1
Rõ ràng, khi truyền đối số là đối tượng Main n1, n2 vào hàm swap
thì data của các đối tượng này sẽ thay đổi sau khi ra khỏi hàm swap
. Đối tượng Main n1, n2 là biến tham chiếu trong Java.
Bài này đã giới thiệu các bạn về truyền tham trị và tham chiếu trong Java. Trong Java, các tham số có kiểu dữ liệu nguyên thủy đều là truyền tham trị. Các tham số có kiểu dữ liệu không phải là kiểu nguyên thủy đều là truyền tham chiếu.
Có một sự khác nhau lớn giữa truyền tham trị và tham chiếu trong Java và C++. Các bạn có thể đọc bài Truyền tham trị và truyền tham chiếu cho hàm trong C++ để hiểu rõ sự khác nhau này.