2008-12-19 13 views
5

Tôi đang làm những điều khoản sau đây trong Java,Điều gì xảy ra chính xác trong khi bạn gán một tham chiếu đến một phần tử trong Mảng trong Java?

Obj t[] = new Obj[10]; 

Obj a = new Obj("a"); 
t[0] = a; 

a = new Obj("b"); 
t[1] = a; 

Tại sao trong java, khi tôi truy cập vào t [0], nó sẽ trả tôi "a", chứ không phải là "b"? Đây có phải là do GC không? và tôi có thể tin là an toàn để thực hiện một hoạt động như vậy

Trả lời

10

Dưới đây là chính xác những gì đang xảy ra.

Obj t[] = new Obj[10]; // 1 

Obj a = new Obj("a"); // 2 
t[0] = a; 

a = new Obj("b");  // 3 
t[1] = a;    // 4 
  1. Bạn tạo một mảng có thể chứa tài liệu tham khảo 10 với các trường hợp Obj. Gọi số này obj01. Bạn chỉ định nó cho t. Lưu ý rằng biến số t và đối tượng thực tế obj01 có mối quan hệ khá bình thường.

  2. Bạn tạo phiên bản Obj, gọi số này obj02. Bạn chỉ định tham chiếu đến đối tượng này cho biến a. Lưu ý rằng biến số a và đối tượng thực tế obj02 có mối quan hệ khá bình thường.

    Bạn cũng đặt tham chiếu này vào t[0]. Bạn có một đối tượng được biết đến ở hai nơi. Đối tượng obj02 (với giá trị là "a") được gọi là a và còn được gọi là t[0].

  3. Bạn tạo một phiên bản Obj, gọi số này obj03. Bạn chỉ định tham chiếu đến đối tượng mới này cho biến cũ a. Lưu ý rằng biến số a và đối tượng thực tế obj03 có mối quan hệ khá bình thường. a được sử dụng để tham chiếu obj02, nhưng nó không tham chiếu nữa.

    Vì vậy, obj01 (một mảng) được tham chiếu bởi t; obj02 (và ví dụ của Obj) được gọi là t[0]; obj03 (ví dụ Obj) được gọi là a.

  4. Bạn đặt tham chiếu ở số a vào t[1]. Vì vậy, t[1] được tham chiếu đến obj03.

Tại thời điểm này tất cả các đối tượng được tham chiếu bởi các biến nằm trong phạm vi. Vì tất cả các đối tượng đều có tham chiếu nên chúng không thể được thu thập rác.

1

Khi bạn thực hiện t [0] = a; bạn gán địa chỉ của đối tượng mà bạn đã tạo bởi đối tượng mới ("a") trong mảng, bất kể bạn sử dụng lại biến nào sẽ không thay đổi giá trị chứa trong mảng.

6

Vấn đề là, Java không có con trỏ.

Khi bạn chỉ định một biến đối tượng, biến này sẽ thay đổi biến đó trỏ đến nhưng không thay đổi bất kỳ tham chiếu nào khác mà bạn có thể có.

Vì vậy:

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

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

// At this point, a = "b" 
// and b = "c" 

Như bạn có thể thấy, mặc dù bạn lần đầu tiên thiết lập a = b, khi bạn sau đó thiết lập b là một đối tượng mới, một vẫn giữ tham chiếu đến đối tượng cũ.

+0

Đó là chính xác những gì người ta mong đợi và không phải là một “vấn đề ", thực ra. :) – Bombe

+0

Xin lỗi, nên đã làm cho nó rõ ràng hơn rằng đây là hành vi mong đợi. Tính năng thiết kế của Java hơn là một vấn đề như vậy. –

+0

Cũng không có con trỏ không phải là một vấn đề Java. – OscarRyz

2

Giá trị trong mảng chỉ là tham chiếu. Nó giống như làm điều này:

Obj a = new Obj("a"); 
Obj t0 = a; 
a = new Obj("b"); 

Cuối cùng, biến t0 có giá trị nó đã được đưa vào dòng 2 - có nghĩa là, một tham chiếu đến Obj đầu tiên được tạo ra trên dòng 1. Thay đổi giá trị của a biến không thay đổi giá trị của t0.

Sau khi bạn hiểu được điều trên, chỉ cần nghĩ về một mảng dưới dạng tập hợp các biến, ví dụ:

Obj[] t = new Obj[10]; 

khoảng như tuyên bố:

Obj t0, t1, t2, t3, t4, t5, t6, t7, t8, t9; 

(Có rất nhiều sự khác biệt, nhưng trong bối cảnh của câu hỏi này chúng tương tự.)

0

Tại sao trong java, khi tôi truy cập t [0], nó trả về tôi "a", thay vì "b"?

Vì bạn đã yêu cầu anh ta giữ tham chiếu đến đối tượng bằng "a".

Java không thao tác trực tiếp các đối tượng. Thay vào đó tôi sử dụng có tham chiếu đối tượng. Nhưng tham chiếu này giữ giá trị của tham chiếu (không phải tham chiếu) Vì vậy, khi bạn gán cho t [0] giá trị của a, cả hai đều tham chiếu cùng một đối tượng.

Hãy xem nếu pic này giải thích nó tốt hơn:

alt text http://img520.imageshack.us/img520/8857/referencesq4.png

Thứ nhất, a và t [0] tham khảo cùng một đối tượng.

Sau đó thả tham chiếu đó nhưng t [0] không.

Ở cuối a và t 1 tham chiếu cùng một đối tượng và t [0] vẫn không thay đổi.

Đây có phải là do GC không?

Không

và tôi có thể tin rằng nó là an toàn để làm như vậy một hoạt động

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