2013-06-26 37 views
7

Hãy nói rằng chúng tôi có một lớp:cấu trúc logic/chi tiết của biến tham chiếu và đối tượng trong bộ nhớ?

class Class1 
{ 
    int i = 1; 
} 

và chúng tôi có một biến:

Class1 ob1 = new Class1(); 
  • Liệu một tài liệu tham khảo chính lưu trữ trong một ob1 cửa hàng biến những thông tin mà nó đề cập đến một đối tượng của Class1?
  • Phần heap có Class1 được lưu trữ lưu trữ thông tin thuộc loại Class1 không?
  • Thông tin này giống như thế nào về mặt logic? Đó là một chuỗi như application1.Class1 hoặc tham chiếu đến một số nhóm tham chiếu?

Nếu bạn có thể giới thiệu nguồn thông tin như vậy, tôi sẽ rất biết ơn vì đã cung cấp thông tin tôi không thể tìm thấy trong sách tham khảo.

Trả lời

1

Bản thân tài liệu tham khảo được lưu trữ trong biến ob1 có lưu trữ thông tin là tham chiếu đến đối tượng của Class1 không?

NO. Biến tham chiếu ob1 chỉ lưu trữ tham chiếu của đối tượng mà nó trỏ tới. Và thông tin về đối tượng đó đã được biết đến với ứng dụng (hoặc JVM).

Phần heap nơi Class1 được lưu trữ thông tin là loại Class1 phải không?

NO. Thông tin về lớp đang được tải được lưu trữ trong method area.Theo quy định tại this link
Đối với mỗi loại nó tải, một máy ảo Java phải lưu trữ các loại thông tin sau đây trong lĩnh vực phương pháp:

  • Tên đầy đủ của các loại
  • Tên đầy đủ của siêu lớp trực tiếp của loại (trừ khi loại là giao diện hoặc lớp java.lang.Object, không phải loại nào có siêu lớp)
  • Loại có phải là một lớp hay giao diện
  • Bộ sửa đổi của loại (một số tập hợp con của` công cộng, trừu tượng, cuối cùng)
  • Một lệnh danh sách tên đầy đủ của bất kỳ superinterfaces trực tiếp

như thế nào một cách logic trông giống như thông tin này? Đó là một chuỗi như application1.Class1 hoặc tham chiếu đến một số nhóm tham chiếu?

Bên trong tệp lớp Java và máy ảo Java, nhập tên luôn được lưu trữ dưới dạng tên đủ điều kiện. Ví dụ, tên đầy đủ của đối tượng lớp trong gói java.lang được biểu diễn là java/lang/Object. Trong khu vực phương pháp, tên đầy đủ đủ điều kiện có thể được thể hiện dưới bất kỳ hình thức và cấu trúc dữ liệu nào mà nhà thiết kế chọn.

1

Mọi tham chiếu đối tượng java đều biết lớp của nó khi chạy; này cái gọi là "loại thông tin thời gian chạy" được sử dụng trong mã như thế này:

if (obj instanceof class1) { 
    // true! 
} 

Bạn cũng có thể truy cập vào các lớp của một đối tượng thông qua obj.getClass(). Điều này sẽ trả về class1.class, một đối tượng của lớp Class<class1>. Xem phương thức Object.getClass.

(Lưu ý rằng nếu lớp học của bạn là tham số, như class1<T>, loại T sẽ không được lưu trữ trong thời gian chạy, do "tẩy xoá".)

Tôi không biết liệu các thông tin lớp được lưu trữ với con trỏ hoặc với dữ liệu; nó có thể thực hiện cụ thể trong jvm; nhưng nó hầu như không quan trọng từ quan điểm thực tế. (Vì vậy, hoặc là câu trả lời 1 hoặc 2, hoặc cả hai, là "có").

Câu trả lời cho 3 là, theo như lập trình viên java có liên quan, thông tin loại thời gian chạy được đóng gói trong đối tượng của lớp Class. Theo các trang bìa, một JVM có thể thực hiện điều này theo cách này hay cách khác.

0

enter image description here

Đây là một trong những chương trình trong đó các JVM có thể lưu trữ thông tin của lớp cho việc kiểm tra trong thời gian chạy bằng instanceOf.

Mọi máy ảo Java phải có khả năng xác định thông tin về lớp của nó, chỉ được tham chiếu đến một đối tượng. Điều này là cần thiết vì nhiều lý do, bao gồm cả việc truyền kiểu an toàn và toán tử instanceof.

Đây là một cách trong đó triển khai máy ảo Java có thể kết hợp thông tin lớp với dữ liệu cá thể cho một đối tượng. Trong con số này, một con trỏ nguyên bản đến một cấu trúc dữ liệu chứa thông tin lớp được lưu trữ cùng với các biến mẫu cho một đối tượng. Các chi tiết trong đó các cách khác nhau mà JVM có thể kết nối với dữ liệu của đối tượng với thông tin lớp của nó nằm ngoài phạm vi của bài viết này. Điều quan trọng cần hiểu ở đây là thông tin lớp sẽ theo cách nào đó được liên kết với dữ liệu cá thể của đối tượng và dữ liệu cá thể bao gồm các trường cho lớp của đối tượng và tất cả các lớp siêu lớp .

Artima post on Object initialization

Vì vậy, khi bạn làm instanceOf kiểm tra các thông tin về các lớp được truy cập thông qua con trỏ này. Nhưng một lần nữa hãy nhớ rằng việc thực hiện chính xác về việc lưu trữ thông tin lớp có thể được thực hiện cụ thể.

1

Trả lời câu hỏi của bạn:

  1. Không, nó không. Tham chiếu chỉ là một tham chiếu, nghĩa là một số địa chỉ trong heap, nơi đối tượng tương ứng được lưu trữ. Không cần phải lưu trữ thông tin trùng lặp về kiểu tham chiếu trong chính tham chiếu, bởi vì biến thực sự thực, có chứa địa chỉ tham chiếu của nó có thể là các kiểu lớp khác nhau.

  2. Câu hỏi rất lạ. Tất nhiên, có, nó. Hơn nữa, "phần heap" này là một đối tượng, trong đó có mô tả lớp cụ thể này. Bất kỳ đối tượng Class nào chứa thông tin về tên đầy đủ của lớp đó, được mô tả bởi nó.

  3. Nó không phải được định nghĩa như thế nào có vẻ hợp lý, nếu bạn có ý nghĩa cấu trúc của nó:

2.7 Representation of Objects:

Java máy ảo không ban hành bất kỳ đặc biệt nội cấu trúc cho các đối tượng.

Nhưng nếu chúng ta đang nói về thông tin về lớp loại - vâng, nó chỉ là một đối tượng String, bởi vì "loại" của Class đối tượng (mà nó là đại diện) chỉ là một tên của lớp tương ứng.

+0

1. Không, không. um nhưng câu trả lời dưới đây nói "Mỗi máy ảo Java phải có khả năng xác định thông tin về lớp của nó, chỉ cho một tham chiếu đến một đối tượng." – MaxNevermind

+0

@MaxNevermind Tôi không thấy, ở đâu? Bạn không nhầm lẫn với thuật ngữ 'tham chiếu' và 'dữ liệu đối tượng'? Sử dụng tham chiếu nó có thể đơn giản nhìn vào đối tượng và xác định lớp đó là gì. – Andremoniy

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