Đầu vào của các phương thức trong Java Method parameter, Học Java cơ bản bằng Tiếng Việt
  • 3 năm trước
Đầu vào của các phương thức trong Java Method parameter, Học Java cơ bản bằng Tiếng Việt

đường dẫn đến toàn bộ video của chương trình học
https://dailymotion.com/playlist/x7429d

Làm rõ 2 khái niệm call by value và call by reference
Java thực sự là call by value hay call by reference





















có nghĩa là phương thức chỉ lấy được giá trị của biến được truyền vào
tức là chương trình sẽ copy nội dung của biến được truyền vào , rồi chuyển nó cho phương thức được gọi
mọi thay đổi đến với biến này đều không có tác dụng với biến được truyền vào
Ví dụ
void changeEmployee(Employee ee){
ee = new Employee()
}
có nghĩa là phương thức này sẽ lấy được địa chỉ ô nhớ của biến truyền vào, và từ đó thay đổi được giá trị được lưu tại biến đó
thay đổi thực sự, không phải là thay đổi 1 phần
ví dụ : ngôn ngữ C++
void swap(int &x, int &y){
int z = x;
x = y;
y = z;
}
Câu trả lời là call by value,
Sẽ có nhiều bạn làm việc với Java sốc, vì điều đó không đúng với những điều mà bạn từng nghĩ và từng được đọc, vì nhiều tác giả cũng cho rằng Java có sử dụng call by reference
Tôi cũng không tin cho đến khi đọc cuốn
Tôi sẽ minh họa trong phần tiếp theo
public static void tripleValue(double x) // doesn't work
{
x = 3 * x;
}
double percent = 10;
tripleValue(percent);
x được xác lập với bản sao giá trị của biến percent
x được tăng gấp 3 lần , bây giờ nó là 30, trong khi đó percent vẫn là 10
kết thúc phương thức , x bị loại bỏ, percent giữ nguyên giá trị cũ
ta có đoạn code sau
public static void tripleSalary(Employee x) // works
{
x.raiseSalary(200);
}
harry = new Employee(. . .);
tripleSalary(harry);
x được xác lập với 1 bản sao giá trị của harry, tức là địa chỉ của đối tượng mà harry đang tham chiếu đến trong bộ nhớ
phương thức raiseSalary chạy trên tham chiếu đó, giá trị salary mà cả x và harry cùng trỏ đến được cập nhật
phương thức chấm dứt, x bị xóa, harry vẫn tồn tại và vẫn tham chiếu đến đối tượng mà chúng ta vừa cập nhật
public static void update(Employee x) // works
{
y = new Employee();
x = y
x.raiseSalary(200);
}
harry = new Employee(. . .);
update(harry);
public static void update(Employee x) // works
{
y = new Employee();
x = y
x.raiseSalary(200);
}
harry = new Employee(. . .);
update(harry);
x được xác lập với 1 bản sao giá trị của harry, tức là địa chỉ của đối tượng mà harry đang tham chiếu đến trong bộ nhớ
x được tái xác lập và tham chiếu đến 1 đối tượng mới
phương thức raiseSalary chạy trên tham chiếu đó, giá trị salary do x và y trỏ đến được cập nhật , đối tượng do harry trỏ đến không được cập nhật
phương thức chấm dứt, x bị xóa, harry vẫn tồn tại và vẫn tham chiếu đến đối tượng cũ, đối tượng này không bị cập nhật

Được khuyến cáo