Truyền tham trị
(Passing Arguments by Values)
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 Listing 6.4, 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.
Listing 6.5 đư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 phouwng
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.
Trước khi phương thức swap được gọi (dòng 12),
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 6.4,
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 trên: 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
Dữ liệu và
phương thức của đối tượng có thể được truy cập thông qua toán tử dấu chấm
(.)qua biến tham chiếu của đối tượng.
Các đối tượng
được tạo mới được cấp phát trong bộ nhớ. Chúng có thể được truy cập thông qua
các biến tham chiếu.
Biến tham
chiếu và kiểu dữ liệu tham chiếu
(Reference
Variables and Reference Types)
Các đối tượng
được truy cập qua biến tham chiếu của đối tượng, biến tham chiếu của đối tượng
chứa tham chiếu tới các đối tượng. Các biến như vậy được khai báo sử dụng cú
pháp sau:
ClassName
objectRefVar;
Một lớp về
bản chất là một kiểu dữ liệu do lập trình viên định nghĩa. Một lớp là một kiểu
dữ liệu tham chiếu, có nghĩa là một biến của lớp có thể tham chiếu tới một thể
hiện của lớp. Câu lệnh sau khai báo biến myCircle thuộc kiểu Circle:
Circle myCircle;
Biến myCircle
có thể tham chiếu tới đối tượng Circle. Câu lệnh tiếp theo tạo một đối
tượng và gán tham chiếu của nó tới myCircle:
myCircle = new Circle();
Bạn có thể
viết một câu lệnh đơn giản kết hợp khai báo một biến tham chiếu đối tượng, tạo
ra một đối tượng và gán đối tượng tham chiếu đến biến với cú pháp sau:
ClassName objectRefVar = new ClassName();
Đây là một
ví dụ:
Circle myCircle = new Circle();
Biến myCircle
giữa một tham chiếu tới đối tượng Circle
Chú ý
Một biến
tham chiếu đối tượng xuất hiện để giữa một đối tượng thực chứa một tham chiếu tới
đối tượng đó. Nghiêm túc nói, một biến tham chiếu đối tượng và một đối tượng là
khác nhau, nhưng phần lớn sự khác biệt này bị bỏ qua. Vì vậy, để đơn giản, tốt
nhất hãy nói rằng myCircle là một đối đối tượng Circle thay vì mô
tả lòng vòng rằng myCircle là một biến mà chứa tham chiếu tới đối tượng Circle.
Chú ý
Mảng được
xem như là các đối tượng trong Java. Mảng được tạo bằng cách sử dụng toán tử new.
Đăng nhận xét