Biến / tham số trong Java có hai kiểu, thứ nhất là kiểu giá trị và thứ hai là kiểu tham chiếu.

Tham số kiểu giá trị (Tham trị) trong Java

Kiểu này dành cho các biến, tham số khai báo kiểu dữ liệu cơ bản nguyên thủy gồm: byte, short, int, long, float, double, boolean, char xem thêm những kiểu dữ liệu nguyên thủy Java

Kiểu này thì mỗi biến có lưu giá trị của biến chính xác tại địa chỉ bộ nhớ dành cho biến đó (nói cách khác địa chỉ bộ nhớ có lưu giá trị), hai biến có tên khác nhau thì có hai địa chỉ bộ nhớ khác nhau để lưu dữ liệu. Do vậy, với tham số kiểu này khi chuyển nó trong các tham số, các phép toán nó truyền giá trị (copy giá trị từ địa chỉ bộ nhớ này sang địa chỉ bộ nhớ khác) chứ không truyền bản thân địa chỉ của biến trong bộ nhớ.

Xem ví dụ sau:

public class App {

    // Phương thức có tham số kiểu int, với kiểu int (kiểu nguyên thủy)
    // thì tham số truyền là giá trị (tham trị)
    static void addOneTo(int num) {
        num = num + 1;
    }

    static void Test_addOneTo()
    {
        int x = 5;

        // giá trị biến x được truyền (copy) vào tham số hàm (biến cục bộ),
        // bản thân địa chỉ ô nhớ lưu giá trị biến x hàm không biết
        addOneTo(x);
        System.out.println(x);  // In ra 5
    }

}
// Gọi hàm Test_addOneTo() kết quả in ra:
// 5

Ở ví dụ trên, phương thức addOneTo() nhận tham số giá trị (kiểu int) là 5, chứ không phải nhận địa chỉ biến, nên bản thân biến ngoài hàm không bị tác động, biến x của hàm main vẫn là 5 sau khi chạy addOneTo(x);

Tham số kiểu tham chiếu trong Java

Tham số tham chiếu (Reference Type) nó lưu trữ bên trong nó một địa chỉ tham khảo (chứ không phải giá trị) mà địa chỉ đó sẽ dùng để truy cập bộ nhớ khi lưu / lấy dữ liệu (giá trị) của biến (chính là các đối tượng).

Trong Java tất các các biến của lớp (đối tượng) đều là kiểu tham chiếu.

Hãy xem ví dụ sau, giả sử có lớp Person

public class Student {

    private String Name;
    private int Age;

    public void setName(String name) {
    this.Name = name;
    }

    public void setAge(int age) {
      this.Age = age;
    }

    public int getAge() {
      return this.Age;
    }
}

Sử dụng lớp Student kiểm tra làm tham số phương thức


static void celebrateBirthday(Student p) {
    p.setAge(p.getAge() + 1);
}

static void test_celebrateBirthday()
{
    Student j;
    j = new Student("XuanThuLab");
    j.setAge(20);

    // j là đối tượng do nó là tham số tham chiếu, hàm celebrateBirthday tương tác với chính đối tượng
    // lớp Person mà biến trỏ tới
    celebrateBirthday(j);
    System.out.println(j.getAge()); //21
}

// Gọi phương thức test_celebrateBirthday
// Xuất ra "21"

Bạn thấy phương thức celebrateBirthday nhận đối tượng Student làm tham số, do là đối tượng từ lớp mà tham số này tham chiếu đến nên các biến đổi đối tượng trong celebrateBirthday chính là tác động đến đối tượng gốc.

Kiểu Array, String là tham chiếu, các đối tượng (tạo ra từ lớp) là kiểu tham chiếu

Tham khảo code ReferenceAndValue (git) hoặc tải về tại referencetype


Đăng ký nhận bài viết mới