2010-03-18 27 views
15

MyClass.classMyClass.getClass() cả hai dường như trả lại một java.lang.Class. Có sự phân biệt tinh tế hoặc chúng có thể được sử dụng thay thế cho nhau không? Ngoài ra, là MyClass.class một tài sản công cộng của lớp học siêu lớp Class? (Tôi biết điều này tồn tại nhưng dường như không tìm thấy bất kỳ đề cập nào về nó trong javadocs)Sự khác nhau giữa việc gọi MyClass.class và MyClass.getClass()

Trả lời

19

Một là một phương thức thể hiện, vì vậy nó trả về lớp của đối tượng cụ thể, còn lại là hằng số lớp (tức là thời gian biên dịch).

Class n = Number.class; 
Number o = 1; 
o.getClass() // returns Integer.class 
o = BigDecimal.ZERO; 
o.getClass(); // returns BigDecimal.class 

Cả hai trường hợp trả lại các thể hiện của đối tượng Lớp, mô tả một lớp Java cụ thể. Đối với cùng một lớp, chúng trả về cùng một cá thể (chỉ có một đối tượng Lớp cho mỗi lớp).

Một cách thứ ba để có được các đối tượng Class sẽ

Class n = Class.forName("java.lang.Number"); 

Hãy ghi nhớ rằng giao diện cũng có các đối tượng lớp (ví dụ như số ở trên).

Ngoài ra, MyClass.class có phải là thuộc tính công khai của lớp cha lớp học không?

Đây là từ khóa ngôn ngữ.

+1

Ý anh là gì bởi một "Class liên tục"? Khi bạn gán "Class n = Number.class;" giá trị của n là bao nhiêu? – Mocha

+1

n được chỉ định một thể hiện của Class, đối tượng với mô tả số "lớp" (mà thực sự là một giao diện). – Thilo

4

MyClass không có phương thức getClass tĩnh, nói cách khác, bạn không thể gọi MyClass.getClass(), thay vào đó bạn cần gọi (new MyClass()). GetClass() để nó hoạt động.

getClass() sẽ trả về đối tượng MyClass.class. Vì vậy, nói cách khác, MyClass.class là đối tượng kết quả trong khi getClass() là một phương thức. Phương thức getClass() hữu ích trong trường hợp bạn không biết lớp thực tế của đối tượng, ví dụ:

 

public void someMethod(Object o) { 
    if(o.getClass().equals(Set.class)) { 
     // The object is a set 
    } else if(o.getClass().equals(List.class)) { 
    // The object is a List 
    } 
} 
 

Lưu ý rằng ví dụ mã trên không phải là tốt nhất có thể, tôi chỉ đang cố gắng cho thấy nó có thể được sử dụng như thế nào. Các chức năng tương tự có thể đạt được với if(o instanceof Set) { ...}

5

.getClass() trả về lớp thời gian chạy của đối tượng, vì vậy nó có thể thay đổi khi bạn thay đổi lớp của biến

.class mặt khác luôn luôn trả hằng số lớp của "Loại"

LƯU Ý
Nếu lớp thời gian chạy xảy ra giống với lớp TYPE, cả hai sẽ bằng nhau. Ví dụ:

Long x = new Long(2); 
Class c1 = Long.class; 
Class c2 = x.getClass(); 

//c1==c2 
+0

".class, mặt khác luôn trả về hằng số lớp của" Loại "-> Điều đó có nghĩa là gì? – Mocha

+1

@Mocha' Long' là một kiểu, 'new Long (2)' là đối tượng mới của kiểu đó – MBO

1
What's the difference between calling MyClass.class and MyClass.getClass() 

Trước hết tiêu đề câu hỏi của bạn là một chút sai lầm! .getClass() is a method defined in java.lang.Object vì vậy bất kỳ đối tượng nào trong java đều có thể gọi nó là .class được gọi trên chính lớp đó (giống như các biến tĩnh công cộng). Vì vậy, câu hỏi cần được (gắn bó với công ước java đặt tên)

What's the difference between calling MyClass.class and myClassObject.getClass() 

Bây giờ chênh lệch thực tế

.getClass() là một phương pháp java bản địa java.lang.Object.Phương thức này sẽ trả về đối tượng java.lang.Class tương ứng với runtime class của đối tượng mà trên đó nó được gọi ra. Vì vậy,

Test t = new TestSubClass(); 
    Class c2 = t.getClass(); 
    System.out.println(c2); 

sẽ in class TestSubClass

nơi như .class sẽ trở lại lớp tĩnh đánh giá (được biết đến tại thời gian biên dịch). Nó thực sự là lớp đối tượng tương ứng với loại tài liệu tham khảo trỏ đến thực tế object.So

Test t = new TestSubClass(); 
    Class c2 = Test.class; 
    System.out.println(c2); 

sẽ in class Test

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