2013-09-01 45 views
5

Tôi có một vài câu hỏi về các trường hợp của lớp họctrường hợp của lớp Class

1) Tôi có hiểu chính xác nói rằng lớp Dog không chỉ có một thể hiện của lớp học. Nói cách khác, được cung cấp các dòng sau

Dog dog1 = new Dog(); 
Dog dog2 = new Dog(); 

Class dog1Class = dog1.getClass(); 
Class dog2Class = dog2.getClass(); 
Class dogClass = Dog.class; 

chỉ có một trường hợp của lớp học - Class<Dog>.

Nếu bạn so sánh các tham chiếu này với ==, bạn nhận được rằng chúng là cùng một đối tượng.

Câu hỏi chính xác là, getClass và static .class luôn trả về cùng một cá thể trong khi thực hiện một phương thức chính không?

2) Khi nào các trường hợp này được tạo chính xác?

+6

Nếu bạn có nhiều trình nạp lớp, mọi thứ trở nên phức tạp hơn ... –

+0

Câu hỏi khá hay và @Oli đã nói, nhiều trình nạp lớp và tải động đặc biệt có thể ném toàn bộ bộ thu phóng trong các tác phẩm. Thực sự tò mò để xem câu trả lời thực sự là gì. – Esko

Trả lời

5

sẽ getClass và .class tĩnh luôn luôn trở về cùng dụ

Không, không chính xác. Phương thức dog.getClass() trả về kiểu thời gian chạy của con chó.

Hãy xem xét các loại sau đây:

class Animal { } 
class Dog extends Animal { } 

Và sau đó trong phương pháp chính:

Animal dog = new Dog();  
System.out.println(dog.getClass()); // Prints class Dog 
System.out.println(Animal.class);  // Prints class Animal 

Khi biết chính xác là những trường hợp này tạo ra?

Khi lớp được nạp lần đầu bởi JVM. Từ tài liệu của Class:

Các đối tượng lớp được xây dựng tự động bởi Máy ảo Java dưới dạng các lớp được tải và bằng cách gọi hàm defineClass trong trình tải lớp.

Đối với nghiên cứu chi tiết:

1

Chỉ có một Class dụ đại diện cho một lớp học; bạn có thể yên tâm rằng đó là cùng một ví dụ, không có vấn đề làm thế nào bạn nhận được nó.

Ví dụ: phương pháp đồng bộ hóa tĩnh sử dụng ví dụ chính xác đó cho khóa; dường như nó sẽ không hoạt động nếu có nhiều trường hợp. xem http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.3.6

+0

Chính xác)) Tôi không nghĩ về nó –