Trong quá trình học các kiến thức lập trình Java, chắc chắn không ít bạn nhầm lẫn khái niệm tham trị và tham chiếu? Có rất nhiều bạn có nhận định chưa đúng về hai khái niệm này. Ví dụ như các bạn nói các tham số trong hàm nếu ta truyền kiểu nguyên thuỷ thì đó là tham trị còn nếu truyền kiểu object là tham chiếu. Hôm nay anh sẽ giải thích cho các bạn hiểu rõ 2 khái niệm này nhé. Để hiểu được bài viết này thì các em nên đọc qua bài viết về (bộ nhớ)[https://levunguyen.com/laptrinhjava/2020/04/07/phan-biet-bo-nho-heap-va-stack/] để nắm được cách lưu trữ các giá trị trong lập trình
Trước hết mình xem lại bộ nhớ máy tính lưu trữ các biến và giá trị mình như thế nào? Nếu các bạn còn chưa rõ về cách lưu trữ thì có thể xem lại bài viết bộ nhớ tại (đây)[https://levunguyen.com/laptrinhjava/2020/04/07/phan-biet-bo-nho-heap-va-stack/]
Địa chỉ bộ nhớ | Giá trị ô nhớ |
---|---|
xx1 | test |
xx2 | 3 |
Tham trị Pass by value : nghĩa là mình sẽ clone (tạo ra một giá trị mới bằng cách copy giá trị gốc), và mình chỉ thao tác giá trị với bản copy. Khi chúng ta thay đổi các giá trị của đối tượng, thì không ảnh hưởng đến giá trị gốc. Pass-by-value được hiểu là khi bạn thay đổi biến trong hàm thì ngoài hàm sẽ không bị ảnh hưởng.
Sau khi hàm process(int value) thực hiện xong nhiệm vụ của mình, thì sẽ bị giải phóng đi, trả lại bộ nhớ cho chương trình, giá trị clone (copy) cũng được giải phóng trả lại bộ nhớ.
Tham chiếu Pass by reference. Ngược lại với Pass by value, giá trị gốc sẽ bị thay đổi Pass-by-reference là khi bạn thay đổi biến trong hàm cũng làm ngoài hàm bị ảnh hưởng. Nó giống như bạn truyền đúng địa chỉ của biến đó vào hàm.
Trong trường hợp này hàm process(int &value) trỏ thẳng tới địa chỉ vùng nhớ nơi lưu giá trị 7. Như vậy khi ta thay đổi giá trị trong hàm nó sẽ thay đổi luôn giá trị khác .
Các bạn nên nhớ trong Java là 100% truyền tham trị (passed by value). Mình chỉ clone một giá trị từ giá trị gốc sau đó truyền đi cho các method cần dùng nó. Ta chỉ thay đổi giá trị Clone chứ không thay đổi trực tiếp giá trị vùng nhớ của đối tượng gốc