Khi làm việc với Java, việc hiểu rõ cách truyền tham số vào phương thức là rất quan trọng, vì nó ảnh hưởng đến cách mà dữ liệu được xử lý trong chương trình. Hai khái niệm quan trọng liên quan đến việc truyền tham số là Pass by Reference và Pass by Value. Bài viết này sẽ giải thích chi tiết về hai khái niệm này và cách chúng hoạt động trong Java.

1. Pass by Value

1.1. Khái niệm

  • Pass by Value có nghĩa là một bản sao của giá trị được truyền vào phương thức. Khi bạn truyền một biến vào phương thức, Java tạo ra một bản sao của giá trị của biến đó và sử dụng bản sao này trong phương thức.

1.2. Hành vi

  • Nếu giá trị của biến thay đổi bên trong phương thức, sự thay đổi đó không ảnh hưởng đến giá trị của biến gốc bên ngoài phương thức.
  • Điều này đúng cho cả kiểu dữ liệu nguyên thủy (primitive types) và đối tượng (reference types).

1.3. Ví dụ

public class PassByValueExample {
    public static void main(String[] args) {
        int number = 5;
        System.out.println("Before method call: " + number); // In ra: 5
        changeValue(number);
        System.out.println("After method call: " + number); // Vẫn in ra: 5
    }

    public static void changeValue(int num) {
        num = 10; // Chỉ thay đổi giá trị của biến num, không ảnh hưởng đến number
    }
}

2. Pass by Reference

2.1. Khái niệm

  • Pass by Reference có nghĩa là một tham chiếu đến đối tượng được truyền vào phương thức. Thay vì truyền giá trị của biến, Java truyền địa chỉ của đối tượng trong bộ nhớ.

2.2. Hành vi

  • Khi một đối tượng được truyền vào phương thức, bất kỳ thay đổi nào được thực hiện đối với đối tượng trong phương thức sẽ ảnh hưởng đến đối tượng gốc bên ngoài phương thức. Điều này là do cả hai biến đều tham chiếu đến cùng một đối tượng trong bộ nhớ.

2.3. Ví dụ

class Person {
    String name;

    Person(String name) {
        this.name = name;
    }
}

public class PassByReferenceExample {
    public static void main(String[] args) {
        Person person = new Person("Alice");
        System.out.println("Before method call: " + person.name); // In ra: Alice
        changeName(person);
        System.out.println("After method call: " + person.name); // In ra: Bob
    }

    public static void changeName(Person p) {
        p.name = "Bob"; // Thay đổi thuộc tính name của đối tượng person
    }
}

3. Sự khác biệt giữa Pass by Value và Pass by Reference trong Java

Tiêu chíPass by ValuePass by Reference
Định nghĩaTruyền một bản sao của giá trịTruyền địa chỉ của đối tượng
Ảnh hưởng đến biến gốcKhông ảnh hưởngẢnh hưởng
Kiểu dữ liệuÁp dụng cho cả kiểu nguyên thủy và đối tượngChỉ áp dụng cho đối tượng
Ví dụThay đổi giá trị của biến nguyên thủy không ảnh hưởng đến biến gốcThay đổi thuộc tính của đối tượng ảnh hưởng đến biến gốc

4. Kết luận

Java luôn sử dụng Pass by Value cho cả kiểu dữ liệu nguyên thủy và tham chiếu. Tuy nhiên, vì đối tượng được truyền dưới dạng tham chiếu, nên các thay đổi trên đối tượng sẽ được phản ánh bên ngoài phương thức. Việc hiểu rõ sự khác biệt này là cần thiết để lập trình viên có thể quản lý và xử lý dữ liệu một cách hiệu quả trong Java.