Cách Java truyền đối số : giá trị hay tham chiếu (pass-by-value hay pass-by-reference)

Kết quả:

Có khi nào bạn hỏi tại sao chưa ?

Trước tiên, mình khẳng định rằng: Java luôn truyền đối số bằng giá trị (pass-by-value).

Khi khởi tạo đối tượng Student, biến student1 sẽ chứa địa chỉ của vùng nhớ đối tượng Student, đối tượng Student được lưu ở heap. Và giá trị của biến student1 được lưu ở stack. Mình sẽ có bài giới thiệu về bộ nhớ của JMV sau, tạm thời mọi người cứ chấp nhận vậy đã.

Khi gọi hàm changeStudentNameWithoutReallocation với đối số truyền vào là biến student1 (giả sử student1 có giá trị là 0x55F40A43). Đầu tiên, JVM sẽ sao chép giá trị của biến student1 sang một biến mới là student1Copy, sau đó biến student1Copy được truyền vào bên trong hàm (biến student1Copy cũng được lưu vào stack). Như vậy cả student1 và student1Copy đều có giá trị chỉ đến vùng nhớ của đối tượng Student mà ta vừa khởi tạo.

Untitled Diagram (2)

Trong hàm changeStudentNameWithoutReallocation, khi chúng ta gọi hàm setName trên biến student1Copy, câu lệnh này sẽ làm thay đổi thuộc tính name của đối tượng mà student1Copy đang trỏ tới. Sau khi ra khỏi hàm, biến student1Copy sẽ không tồn tại nữa. Nhưng sự thay đổi giá trị của vùng nhớ mà nó trỏ tới vẫn giữ nguyên.

Untitled Diagram (3)

Tương tự, khi ta gọi hàm changeStudentNameWithReallocation, với đối số truyền vào là student2, giá trị thật sự được truyền vào hàm là biến student2Copy, được JVM sao chép từ biến student2.

Untitled Diagram (4)

Trong hàm changeStudentNameWithReallocation, khi chúng ta khởi tạo lại thể hiện của biến student2Copy, khi đó student2Copy sẽ trỏ đến một vùng nhớ của đối tượng khác. Do đó, khi gọi setName thì chỉ làm thay đổi thuộc tính name của đối tượng vừa được khởi tạo bên trong hàm changeStudentNameWithReallocation.

Untitled Diagram (5)

Nhắc qua một chút, mình hay nghe mọi người nói truyền tham số vào cho hàm,  như vậy là ko đúng. Tham số (parameter) là những biến, những ký hiệu định nghĩa những giá trị cần thiết để gọi hàm, còn đối số (argument) là những giá trị được truyền vào khi bạn gọi hàm.

Vì vậy, phải nói là truyền đối số cho hàm hoặc truyền giá trị cho tham số của hàm 🙂

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

3 Comments on "Cách Java truyền đối số : giá trị hay tham chiếu (pass-by-value hay pass-by-reference)"

Notify of
avatar
Sort by:   newest | oldest | most voted
Anonymous
Guest

Like

Anonymous
Guest

Mình sẽ có bài giới thiệu về bộ nhớ của JMV sau, tạm thời mọi người cứ chấp nhận vậy đã. <<< Chờ lâu quá bác Trình ơi 😀

Anonymous
Guest

Hay quá cảm ơn bạn