2011-07-23 29 views
5

Hãy tha thứ cho tôi nếu đây là một bản sao, tôi dường như không thể tìm thấy bất cứ điều gì giải thích những gì tôi nhìn thấy tốt.java null sao chép tham chiếu

Các chương trình sau đây:

Object a = new Object(); 
    Object b = a; 

    System.out.println("a: " + a); 
    System.out.println("b: " + b); 

    a = null; 

    System.out.println("a: " + a); 
    System.out.println("b: " + b); 

sản lượng này:

a: [email protected] 
b: [email protected] 
a: null 
b: [email protected] 

Nhưng TẠI SAO?!? Tôi rất bối rối vì điều này. Không nên "b" được tham chiếu "a"? Vì vậy, nếu "a" không còn tham chiếu bất cứ điều gì khác (ví dụ: null) thì không nên "b"? Tôi rõ ràng là thiếu một cái gì đó cơ bản ở đây.

Xin cảm ơn trước.

EDIT # 1

Tôi nghĩ rằng những gì đã ném tôi ra là tôi đang in ra địa chỉ. Đối với một số lý do, trong tâm trí của tôi, tôi đã in ra một số giá trị ma thuật chỉ ra con trỏ \ tham chiếu - khi trong thực tế thiết lập b = a là không làm cho họ giống nhau, nó chỉ đơn giản là tạo ra một con trỏ mới đến cùng một vị trí trên heap. Tôi mong điều này giúp được người nào khác.

Trả lời

8

b không tham chiếu a nó tham chiếu đến cùng một đối tượng a là tham chiếu đến khi bài tập được thực hiện.

Tôi biết đây không phải là cùng một ngôn ngữ, nhưng nếu bạn đã quen thuộc với C, nó cũng giống như:

int someNum = 5; 
int * a = &someNum; // a points to someNum 
int * b = a; // b points to someNum too 
a = NULL; // a doesn't point to anything (points to address 0), b still points to someNum 

(tôi đã sử dụng C vì nó mang lại một cái nhìn rõ ràng hơn về các địa chỉ và tài liệu tham khảo)

+0

Cảm ơn bạn. Cho đến nay giải thích rõ ràng nhất - tôi biết tôi đã thiếu một cái gì đó khá rõ ràng; hoặc có lẽ tôi cần một người bồi dưỡng, DOH! – javamonkey79

+0

Rất vui khi nó xuất hiện rõ ràng :) – MByD

1

Cả a và b là tham chiếu đến đối tượng Object bạn đã tạo. Nó có nghĩa là cả hai điểm đến cùng một khu vực bộ nhớ. Sau đó, bạn tiêu diệt một trong những tài liệu tham khảo này. Bây giờ là một điểm để null. Nhưng cả hai đối tượng và tham chiếu thứ hai cho nó b là còn sống. Đây là những gì bạn thấy.

4

Cho phép có một cái nhìn chi tiết vào những gì đang xảy ra:

//A is pointing to a new Object lets assume memory location for 1 for simplicity 
Object a = new Object(); 
//B is now also pointing to memory location 1 
    Object b = a; 

//Both print the same they are both pointing to memory location 1 
    System.out.println("a: " + a); 
    System.out.println("b: " + b); 

//a is now pointing to null, but there is no change to b which is still pointing to memory location 1 
    a = null; 

    System.out.println("a: " + a); 
    System.out.println("b: " + b); 
1

một tài liệu tham khảo một đối tượng mới (Object a = new Object())
b tham chiếu Object giống như một (Object b = a)
một tài liệu tham khảo không có gì (a=null)
b vẫn tham chiếu đến Đối tượng

2
Object a = new Object(); 

Điều này li ne tạo đối tượng mới trên heap và đặt tham chiếu trong biến a.

Object b = a; 

Java là giá trị vượt qua, vì vậy dòng này chuyển/gán giá trị của tham chiếu đó vào biến b.

a = null; 

Điều này có nghĩa là biến a không còn trỏ đến địa điểm đó trên heap, nhưng không được trỏ đến đâu cả.Nhưng nó không có nghĩa là b điểm hư không, vì chúng tôi đã vượt qua tham chiếu theo giá trị, vì vậy b vẫn trỏ đến đối tượng đó trên heap.

Quan sát chính ở đây là tính theo giá trị. Vì cơ bản chúng tôi đã sao chép giá trị a vào b, việc thay đổi bản gốc sẽ không ảnh hưởng đến cách bản sao trông như thế nào vì nó đã được chụp.

3

Java luôn truyền theo giá trị, đó là tất cả.

0

null không premitive và nó được xem như đối tượng, vì vậy khi bạn gọi a = null, a sẽ đề cập đến không có gì trong khi b vẫn đề cập đến cùng một đối tượng new Object()

Các vấn đề liên quan