01/10/2018, 17:31

Tại sao data là kiểu dữ liệu nguyên thủy nên khi truyền vào phương thức sẽ là kiểu pass by value nhưng sao kết quả trả về lại như kiểu pass by reference

public class Operation {
	int data = 50;
	 
    void change(int j) {
       data = j + 100;
       System.out.println(data);
    }
 

public static void main(String []args) {
	Operation op = new Operation();
	 
    System.out.println("Trước khi thay đổi: " + op.data);
    op.change(500);
    System.out.println("Sau khi thay đổi: " + op.data);

}
}

kết quả trả lại như thế này ạ
Trước khi thay đổi: 50
600
Sau khi thay đổi: 600
đáng nhẽ phải là Trước khi thay đổi: 50
600
Sau khi thay đổi: 50 chứ ạ ?

Nguyễn Đình Anh viết 19:41 ngày 01/10/2018

data là một biến toàn cục nên phải là Pass by reference

rogp10 viết 19:41 ngày 01/10/2018

Tham trị hay tham biến là áp lên số 500 chứ data đâu có bị chi phối đâu. Mà 500 thì chắc chắn là tham trị rồi.

Bùi Gia Anh viết 19:32 ngày 01/10/2018

ở Viettus có cái ví dụ này .e vất vào trong Eclipse thìcũng cho ra kết quả như trong ảnh , nhưng , data trong trường hợp này cũng là biến toàn cục nhưng vẫn là Pass by Value mà ạ

Bùi Gia Anh viết 19:43 ngày 01/10/2018

e thấy ví dụ trong ảnh ( của Viettus ) nó không chính xác . ở method change() ; data kia chỉ là data cục bộ, nó chả tác động gì tới data toàn cục ở int data=50; cả . nếu sửa thành this.data=data+100; thì kết quả sau khi thay đổi sẽ là 600,

Abc viết 19:39 ngày 01/10/2018

Để như kết quả bạn mong muốn thì:

void change(int j) ---> void change(int data)
Songtotnhe viết 19:41 ngày 01/10/2018

Bạn đang suy nghĩ sai rồi nha bạn.
Code của bạn cũng hoàn toàn không liên quan gì đến so sánh tham trị tham chiếu gì cả nha bạn.

  • Ở đoạn code đầu:
int data = 50;
void change(int j) {
    data = j + 100;
}

data ở đây được hiểu là thuộc tính data của object,
data = j + 100, vậy nên bạn truyền j = 500 thì thuộc tính data trong object trở thành 600 là chuẩn rồi! OK nha

  • Ở đoạn code sau:
int data = 50;
void change(int data) {
    data = data + 100;
}

bạn truyền tham số data vào, nhưng mà tham số data này lại trùng tên với thuộc tính data của object, nên khi bạn gán data = …, trình biên dịch không biết bạn muốn nói đến data nào??? Và nó sẽ ưu tiên nghĩ rằng data bạn nhắc đến là tham số. Tức là bạn truyền biến = 500 vào, xong cho biến = 500 + 100, lúc đó biến = 600, thuộc tính data trong object không có gì thay đổi nên nó vẫn như cũ là 50. Vậy nên bạn in ra 50 là đúng rồi hen (đoạn code thứ 2 này không có ý nghĩa gì, có thể do người viết tut cho bạn viết nhầm)

Bạn phải chỉ rõ cho trình biên dịch biến nào là thuộc tính của object (bằng cách dùng this), biến nào là tham số bạn truyền vô như code dưới đây:

int data = 50;
void change(int data) {
    this.data = data + 100;
}
Bài liên quan
0