2012-12-14 43 views
10

Tôi chỉ tò mò muốn hỏi điều này, có thể nó hoàn toàn vô nghĩa.Ví dụ Java với tên lớp

Khi chúng ta đang sử dụng instanceof trong java, như:

if (a instanceof Parent){ //"Parent" here is a parent class of "a" 
} 

tại sao chúng ta không thể sử dụng như dưới đây:

if (a instanceof Parent.class){ 
} 

Liệu thứ hai 'instanceof' có ý nghĩa nhiều hơn từ quan điểm của lập trình nghiêm ngặt? Sự khác biệt giữa "Phụ huynh" và "Parent.class" là gì?

+0

Related http://stackoverflow.com/questions/496928/what-is-the-difference-between-instanceof-and-class-isassignablefrom –

+0

Related http://stackoverflow.com/questions/2590640/why-cant -a-class-variable-be-passing-to-instanceof – PeterMmm

+0

Lưu ý: đối với phương pháp thứ hai, 'Parent.class.isInstance (a)' sẽ là kiểm tra thích hợp. – Vulcan

Trả lời

15

Sự khác biệt giữa "Phụ huynh" và "Parent.class" là gì?

Sau đó là một lớp đen - một cách tiếp cận một đối tượng kiểu Class<Parent>.

Cựu chỉ là tên của một lớp, được sử dụng trong các tình huống khác nhau - khi gọi phương pháp tĩnh, nhà xây dựng, đúc vv

Liệu thứ hai 'instanceof' có ý nghĩa nhiều hơn từ quan điểm của lập trình nghiêm ngặt?

Vâng không phải là ngôn ngữ được định nghĩa - instanceofchỉ tác phẩm với tên của một loại, bao giờ một biểu thức. Nếu bạn có thể viết

if (a instanceof Parent.class) 

sau đó tôi muốn mong đợi bạn có thể viết:

Class<?> clazz = Parent.class; 
if (a instanceof clazz) 

... và đó chỉ là không phải là cách nó hoạt động. Mặt khác, có phương thức Class.isInstance mà bạn có thể gọi nếu muốn.

Ý của bạn là gì về "chế độ xem chương trình nghiêm ngặt" ngay từ đầu?

1

Parent là một lớp, vì vậy ví dụ thứ hai không có ý nghĩa hơn là ví dụ thứ nhất. Bạn đang hỏi nếu cá thể là một thể hiện của lớp, a instanceof Parent là một biểu hiện khá trực tiếp về điều đó.

Parent.class là một dụ của Class, vì vậy ngay cả nếu ví dụ thứ hai biên soạn (nó không, các bên phải của instanceof không thể tự nó là một ví dụ), nó sẽ không kiểm tra những gì bạn muốn nó để kiểm tra. :-)

0

Parent là tên của một loại. Parent.class về bản chất là một biến tĩnh đề cập đến một đối tượng (cụ thể là một thể hiện của Class). Bạn muốn hỏi xem a có phải là một thể hiện của loại Parent không, cho dù đó là một thể hiện của một đối tượng mà chính nó là một thể hiện của một số loại khác (có tên là Class).

0

Khi bạn viết Parent.class thì điều đó có nghĩa là bạn đang tạo đối tượng java.lang.Class cho lớp cha của bạn. Vì vậy, if (a instanceof Parent.class){ } điều này sẽ không hoạt động cho bạn.

Để biết thêm chi tiết về lớp Class hãy xem các liên kết sau đây:
Class

thể hiện của lớp lớp đại diện cho các lớp và giao diện trong một ứng dụng Java chạy. Mỗi mảng cũng thuộc về một lớp được phản ánh như một đối tượng Lớp được chia sẻ bởi tất cả các mảng có cùng loại phần tử và số thứ nguyên. Các kiểu Java nguyên thủy (boolean, byte, char, short, int, long, float và double), và void từ khóa cũng được biểu diễn như các đối tượng Class.

0

Thành viên tĩnh Parent.class thực sự là một đối tượng. Bạn có thể gán nó vào một biến kiểu Object hoặc gõ Class nếu bạn muốn:

Object o = Parent.class; 
Class c = Parent.class; 

Parent mặt khác không phải là một đối tượng hoặc một biến: đó là một Type Name, theo spec Java.

Nếu bạn có thể làm điều này ...

a instanceof Parent.class 

Kể từ Parent.class là một đối tượng sau đó bạn có thể cách khả thi cũng có thể làm điều này:

Cat myCat = new DomesticLonghair(); 
a instanceof myCat; 

... mà chỉ là ngớ ngẩn.