Đầ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<br /><br />đường dẫn đến toàn bộ video của chương trình học <br />https://dailymotion.com/playlist/x7429d<br /><br />Làm rõ 2 khái niệm call by value và call by reference<br />Java thực sự là call by value hay call by reference<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />có nghĩa là phương thức chỉ lấy được giá trị của biến được truyền vào<br />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<br />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 <br />Ví dụ<br />void changeEmployee(Employee ee){<br />ee = new Employee()<br />}<br />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 đó <br />thay đổi thực sự, không phải là thay đổi 1 phần<br />ví dụ : ngôn ngữ C++<br />void swap(int &x, int &y){<br />int z = x;<br />x = y;<br />y = z;<br />}<br />Câu trả lời là call by value, <br />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<br />Tôi cũng không tin cho đến khi đọc cuốn <br />Tôi sẽ minh họa trong phần tiếp theo<br />public static void tripleValue(double x) // doesn't work<br />{<br /> x = 3 * x;<br />}<br />double percent = 10;<br />tripleValue(percent);<br />x được xác lập với bản sao giá trị của biến percent<br />x được tăng gấp 3 lần , bây giờ nó là 30, trong khi đó percent vẫn là 10<br />kết thúc phương thức , x bị loại bỏ, percent giữ nguyên giá trị cũ <br />ta có đoạn code sau<br />public static void tripleSalary(Employee x) // works<br />{<br /> x.raiseSalary(200);<br />}<br />harry = new Employee(. . .);<br />tripleSalary(harry);<br />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ớ <br />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 <br />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 <br />public static void update(Employee x) // works<br />{<br /> y = new Employee();<br />x = y<br />x.raiseSalary(200);<br />}<br />harry = new Employee(. . .);<br />update(harry);<br />public static void update(Employee x) // works<br />{<br /> y = new Employee();<br />x = y<br />x.raiseSalary(200);<br />}<br />harry = new Employee(. . .);<br />update(harry);<br />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ớ <br />x được tái xác lập và tham chiếu đến 1 đối tượng mới <br />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<br />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 <br /><br />