Các đối số được truyền bằng giá trị cho các tham số khi phương thức được gọi
Sức mạnh của một phương thức là khả năng làm việc với các tham số. Bạn có thể sử dụng println để in bất kỳ chuỗi nào và max để tìm giá trị nhỏ hơn giữa hai số nguyên bất kỳ. Khi gọi một phương thức, bạn cần phải cung cấp các đối số, nó phải được cung cấp theo thứ tự như các tham số tương ứng trong method signature. Đây được gọi là sự kết hợp các tham số (parameter order association). Ví dụ, phương thức sau in một thông báo n lần:
public static void nPrintln(String message, int n) { for (int i = 0; i < n; i++) System.out.println(message); }
Bạn có thể sử dụng nPrintln(“Hello”, 3) để in chuỗi Hello 3 lần. Lệnh nPrintln(“Hello”, 3) truyền giá trị trong tham số chuỗi thực là Hello tới tham số message, truyền 3 cho n và in ra Hello 3 lần. Tuy nhiên, lệnh nPrintln(3, “Hello”) bị sai. Kiểu dữ liệu của 3 không khớp với kiểu dữ liệu của tham số đầu tiền là một chuỗi (message), Hello không khớp với tham số thứ 2 là một số nguyên (n)
Lưu ý
Các đối số phải khới với các tham số theo thứ tự, số và kiểu tương thích, như đã định nghĩa trong method signature. Kiểu tương thích có nghĩa là bạn có thể truyền một đối số cho một tham số mà không ép kiểu tường minh, chẳng hạn như truyền một đối số giá trị int tới một tham số giá trị số thực (double)
Khi bạn gọi một phương thức với một đối số, giá trị của đối số được truyền tới tham số. Đây được gọi là truyền tham trị (pass-by-value). Nếu đối số là một biến thay vì một hằng giá trị, giá trị của biến dươcdj truyền tới tham số. Biến không bị ảnh hưởng, bất kể những thay đổi được thực hiện cho tham số bên trong phương thức. Trong hình 1, giá trị của x (1) được truyền cho tham số n để gọi phương thức increment (dòng 5). Tham số n được tăng lên 1 trong phương thức (dòng 10), nhưng x không bị thay đổi.
Hình 1: Lớp Increment
“`public class Increment {
public static void main(String[] args) {
int x =1;
System.out.println(“Before the call, x is:”+ x);
increment(x);
System.out.println(“After the call, x is:”+ x);
}
public static void increment(int n) {
n++;
System.out.println(“n inside the method is “+ n);
}
}“`
Hình 2 đưa ra một chương trình khác chứng tỏ sự ảnh hưởng của việc truyền bằng giá trị. Chương trình tạo ra một phương thức để đổi chỗ giá trị của hai biến. Phương thức swap được gọi bằng cách truyền cho nó 2 đối số. Thật thú vị, các giá trị của các đối số không bị thay đổi sau khi phương thức được gọi.
Hình 2: Lớp TestPassByValue
“`public class TestPassByValue {
/** Main method */
public static void main(String[] args) {
// Declare and initialize variables
int num1 = 1;
int num2 = 2;
System.out.println(“Before invoking the swap method, num1 is ” +
num1 + ” and num2 is ” + num2);
// Invoke the swap method to attempt to swap two variables
swap(num1, num2);
System.out.println(“After invoking the swap method, num1 is ” +
num1 + ” and num2 is ” + num2);
}
/** Swap two variables */
public static void swap(int n1, int n2) {
System.out.println(“\tInside the swap method”);
System.out.println(“\t\tBefore swapping, n1 is ” + n1
+ ” and n2 is ” + n2);
// Swap n1 with n2
int temp = n1;
n1 = n2;
n2 = temp;
System.out.println(“\t\tAfter swapping, n1 is ” + n1
+ ” and n2 is ” + n2);
}
}“`
Trước khi phương thức swap được gọi, num1 là 1 và num2 là 2. Sau khi phương thức swap được gọi, num1 vẫn là 1 và num2 vẫn là 2. Các giá trị của chúng chưa được hoán đổi. Như trong hình, các giá trị của các đối số num1 và num2 được truyền đến n1 và n2, nhưng n1 và n2 có vị trí bộ nhớ riêng của chúng không phụ thuộc num1 và num2. Vì vậy, thay đổi n1 và n2 không ảnh hưởng đến nội dung của num1 và num2.
Một giả thiết khác là thay đổi tên tham số n1 trong swap thành num1. Điều này có ảnh hưởng không? Không có sự thay đổi nào xảy ra, bởi vì nó không tạo ra sự khác biệt dù tham số theo giả thiết là cùng tên. Tham số là một biến trong phương thức với không gian bộ nhớ riêng. Biến được cấp phát khi phương thức được gọi và nó biến mất khi phương thức trả về nơi gọi nó.
Hình. Các giá trị của các biến được truyền vào danh sách các tham số trong phương thức
Chú ý
Để đơn giản, các lập trình viên Java thường truyền x tới y, điều này thực sự có nghĩa là truyền giá trị của đối số x sang tham số y