2010-08-10 37 views
6

Chúng ta biết rằng biến tham chiếu đối tượng chứa các bit đại diện cho một cách để truy cập một đối tượng.Có gì bên trong biến tham chiếu trong Java?

Nó không giữ đối tượng, nhưng nó giữ một cái gì đó giống như một con trỏ hoặc một địa chỉ.

Tôi đã đi qua (2nd edition) cuốn sách Head-First Java và trong cuốn sách đó được viết (trong Chương 3, trang 54) rằng

Trong Java, chúng tôi không thực sự biết những gì là bên trong biến tham chiếu. Chúng tôi làm biết rằng nó là gì, nó đại diện cho một và chỉ một đối tượng. Và JVM biết cách sử dụng tham chiếu để truy cập đối tượng. -

Tôi muốn hỏi:

  • Do một biến tham chiếu đối tượng nắm giữ con trỏ, địa chỉ hoặc những gì?
  • JVM giải thích điều đó như thế nào?
+1

Hãy xem một triển khai mở như OpenJDK nếu bạn tò mò :) – KeatsPeeks

+0

Không, không phải tò mò nhiều lắm :) chỉ là người mới bắt đầu trong Java. –

Trả lời

11

Hoàn toàn tùy thuộc vào JVM để xác định nội dung bên trong tham chiếu.

Trong trường hợp đơn giản nhất, nó sẽ chỉ là một con trỏ (ví dụ: địa chỉ). Trong các trường hợp phức tạp hơn, VM có thể sử dụng các biểu diễn khác nhau tùy thuộc vào tình huống - ví dụ, bạn có thể muốn đọc bài báo trên "Compressed oops in HotSpot" để xem cách HotSpot VM có thể tránh tăng gấp đôi kích thước tham chiếu ở một số nơi (nhưng không phải tất cả) chạy dưới dạng máy ảo 64 bit.

Điều quan trọng là bạn không nên biết hoặc không quan tâm. Theo như bạn đang quan tâm như một lập trình viên, nó chỉ là một tập mờ đục của bit - mục đích duy nhất của nó là để cho bạn nhận được đối tượng trong câu hỏi (hoặc xác định một tham chiếu null).

+0

OK, Cảm ơn :) –

3

Điều đó tùy thuộc vào JVM. Một tham chiếu Java không được đảm bảo để có bất kỳ ngữ nghĩa nào ngoài việc bạn có thể truy cập một đối tượng thông qua nó. Sunacle cũng có thể làm điều đó khác với IBM.

Trong thực tế, nó thường có thể là một con trỏ của một số loại, mặc dù có thể không trực tiếp đến đối tượng kể từ khi có thể được di chuyển bởi GC.

+0

Một câu hỏi hợp pháp sẽ là "các tham chiếu được triển khai trong KeatsPeeks

+2

@Samuel - nó phụ thuộc vào cách bạn xác định "hợp pháp". Trừ khi bạn đang tìm cách để sửa đổi JVM chính nó không có sử dụng thực tế cho thông tin này. Tò mò là tốt, nhưng những loại câu hỏi này luôn khiến tôi nghĩ rằng ai đó đang níu bám vào suy nghĩ của C. –

2

Hoàn toàn là JVM cụ thể. Nó có thể là một địa chỉ, một con trỏ, hoặc một cái gì đó phức tạp hơn. Bạn không có, hoặc cần, bất kỳ đảm bảo khó khăn hơn so với thực tế là bạn có thể nhận được một đối tượng bằng cách sử dụng tài liệu tham khảo.

0

Tùy thuộc vào JVM để quyết định chính xác cách tham chiếu được triển khai.

Có nói rằng, bất kỳ triển khai "lành mạnh" nào có thể sẽ sử dụng con trỏ trực tiếp hoặc một số dạng con trỏ nén vì lý do hiệu suất. Tôi tin rằng điều này áp dụng cho tất cả các JVM sản xuất hiện tại.

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