images
26/01/2021 03:40 am

Tìm hiểu về truyền tham chiếu và truyền tham trị trong lập trình Java OOP

Trong Java, các biến được truyền vào hàm thông qua nguyên tắc truyền giá trị. Điều này khác với C++ là hỗ trợ cả truyền tham trị, truyền tham chiếu và truyền con trỏ.

Passing Value


public static void swap(int a, int b) {

   int temp = a;

   a = b;

   b = temp;

   System.out.println("inside swap(): a=" + a + ", b=" + b);

}


public static void main(String[] args) {

   int a = 5;

   int b = 7;

   swap(a, b);

   System.out.println("outside swap(): a=" + a + ", b=" + b);

}


Kết quả chương trình:


inside swap(): a=7, b=5

outside swap(): a=5, b=7


Nguyên nhân: a, b được truyền vào hàm theo nguyên tắc truyền giá trị


Passing Value với Object



class Number {

   double value;

   public Number(double value) {

       this.value = value;

   }

}


Phần trên ta đã thử truyền tham số với kiểu dữ liệu là Primitive. Nếu như thực hiện truyền tham trị với một Object thì sẽ như thế nào? mời bạn xem tiếp ví dụ sau.


  public static void swap(Number a, Number b) {

       double temp = a.value;

       a.value = b.value;

       b.value = temp;

       System.out.println("inside swap(): a.value=" + a.value + ", b.value=" + b.value);

   }

   public static void main(String[] args) {

       Number a = new Number(5);

       Number b = new Number(7);

       System.out.println("Before swap(): a.value=" + a.value + ", b.value=" + b.value);

       swap(a, b);

       System.out.println("inside swap(): a.value=" + a.value + ", b.value=" + b.value);

   }


Ở đây ta gọi hàm swap và truyền vào 2 đối tượng Number. Trong hàm swap ta thực hiện việc đổi value của a và b. 


Before swap(): a.value=5.0, b.value=7.0

Inside swap(): a.value=7.0, b.value=5.0

Outside swap(): a.value=7.0, b.value=5.0


Trường hợp này, ta thấy giá trị value trong Number được thay đổi. Vậy chuyện gì đã xảy ra. Ở đây JAVA vẫn thực hiện việc truyền tham trị với Number, nhưng thực ra nó sẽ tạo ra biến mới trỏ tới đối tượng Number. Do biến mới cùng trỏ tới 1 đối tượng, nên khi truy cập vào giá trị value, và thay đổi giá trị này, thực chất đối tượng gốc ban đầu cũng bị thay đổi. Với cách thiết kế này, JAVA loại bỏ đi khái niệm về con trỏ hay địa chỉ mà C đưa ra. 


Object.toString()


Trong lập trình JAVA, để biết một đối tượng đang chứa thông tin gì, ta thường sẽ dùng hàm print() để in ra thông tin này. Tuy nhiên, bạn phải sử dụng khai báo thêm hàm toString. Hàm này giúp bạn override một hàm mặc định của Object để có thể biến đổi 1 object thành xâu. 

class A {

     public String toString() {...}

}

Ví dụ khi dùng câu lệnh: System.out.println(new A()) thì dòng lệnh sẽ in ra:

  • object thể hiện của class

  • nếu class có hàm toString() thì sẽ in ra trị của toString(); 



Object.hashCode()


Đây là hàm được sử dụng để trả về giá trị hash của object. Chúng ta thường thấy giá trị này được sử dụng khi làm việc với HashMap, HashSet.  Đặc tính của hàm hashCode() là trả về cùng một giá trị không đổi dù gọi nhiều lần khác nhau.


Object.equals()


Khi so sánh 2 object, ta sử dụng phương thức equals:


- Nếu phương thức equals không được định nghĩa, 2 object được coi là bằng nhau chỉ khi đều chứa cùng giá trị (có thể là giá trị của object - cùng thể hiện 1 đối tượng)


- Nếu phương thức equals được định nghĩa, phương thức này sẽ được sử dụng khi so sánh 2 đối tượng


Object.equals() vs hashCode()


Khi so sánh các đối tượng trong Java, nếu không có equals() hay hashCode() thì việc so sánh sẽ phức tạp do chúng ta phải đi so sánh từng thuộc tính.


Mời các bạn xem thêm bài Lập trình hướng đối tượng trong Java - Phần 1.


- Tech Zone -

Thư giãn chút nào!!!

Bài viết liên quan