2013-02-26 50 views
97

.class có nghĩa là gì trong Java? Ví dụ: nếu tôi đã tạo một lớp có tên là Print. Print.class quay trở lại là gì?.class nghĩa là gì trong Java?

+0

http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html –

+0

Tôi e rằng tôi không hiểu hết những gì bạn đang hỏi. Nếu bạn có thể xây dựng thêm một chút, ai đó có thể cung cấp cho bạn thông tin hữu ích hơn –

+20

Điều này chắc chắn trông giống như một câu hỏi thực sự đối với tôi. Tôi chỉ tự hỏi câu hỏi này, và thấy mình ở đây sau khi tìm kiếm nhanh trên Google. Tôi đoán tôi không nên làm phiền nếu tôi biết rằng câu hỏi của tôi là không có thật! –

Trả lời

92

Khi bạn viết .class sau khi một tên lớp, nó tham chiếu lớp đen - java.lang.Class đối tượng đại diện cho thông tin về lớp nhất định.

Ví dụ: nếu lớp học của bạn là Print thì Print.class là đối tượng đại diện cho lớp Print khi chạy. Nó là cùng một đối tượng được trả về bởi phương thức getClass() của bất kỳ cá thể (trực tiếp) nào là Print.

Print myPrint = new Print(); 
System.out.println(Print.class.getName()); 
System.out.println(myPrint.getClass().getName()); 
+1

Một số điều bạn có thể làm với một đối tượng lớp là gì? – Kevin

+6

@Kevin Xem tài liệu API cho [java.lang.Class] (http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html). –

+0

Ứng dụng: truy cập các trường riêng tư, ví dụ: 'Writer.class.getDeclaredField (" writeBuffer ")'. – jordanpg

36

.class được sử dụng khi không có thể hiện của lớp học.
.getClass() được sử dụng khi có một thể hiện của lớp có sẵn.

object.getClass() trả về lớp của đối tượng đã cho. Ví dụ:

String string = "hello"; 
System.out.println(string.getClass().toString()); 

Sản lượng này sẽ

class java.lang.String 

Đây là lớp học của đối tượng chuỗi :)

+5

'getClass()' là chỉ hữu ích nếu bạn có một tham chiếu trỏ đến một đối tượng của lớp '' ClassName.class' có thể được sử dụng ngay cả khi lớp không có trường hợp nào.Ví dụ, hãy xem xét 'Math.class', mỗi trường hợp là đúng cho các tình huống nhất định –

+0

lời giải thích tốt đẹp ... Cảm ơn !!!! :) – JAVA

+0

Giải thích rõ ràng. Ngay tại điểm của nó.Làm thế nào bạn đã xác định được sự phân biệt giữa '.class' và' .getClass(). ' – Sevastyan

1

Tôi nghĩ rằng mấu chốt ở đây là sự hiểu biết sự khác biệt giữa một lớp và một đối tượng. Một đối tượng là một thể hiện của một Class. Nhưng trong một ngôn ngữ hướng đối tượng đầy đủ, một lớp cũng là một đối tượng. Vì vậy, gọi .class lấy tham chiếu đến đối tượng Lớp của Lớp đó, sau đó có thể được thao tác.

+2

'trong một ngôn ngữ hướng đối tượng đầy đủ, một lớp cũng là một đối tượng'?

3

Nếu một thể hiện của một đối tượng có sẵn, sau đó cách đơn giản nhất để có được lớp của nó là để gọi Object.getClass()

Các .class Cú pháp

Nếu loại có sẵn nhưng không có ví dụ sau đó nó có thể để có được một Class bằng cách thêm .class vào tên của loại. Đây cũng là cách dễ nhất để có được Class cho một kiểu nguyên thủy.

boolean b; 
Class c = b.getClass(); // compile-time error 

Class c = boolean.class; // correct 

Xem: docs.oracle.com about class

2

Nếu không có ví dụ có sẵn sau đó .class cú pháp được sử dụng để có được những đối tượng Class tương ứng cho một lớp học nếu không bạn có thể sử dụng getClass() phương pháp để có được đối tượng Class. Vì không có cá thể của kiểu dữ liệu nguyên thủy, chúng ta phải sử dụng cú pháp .class cho các kiểu dữ liệu nguyên thủy.

package test; 

    public class Test { 
     public static void main(String[] args) 
     { 
      //there is no instance available for class Test, so use Test.class 
      System.out.println("Test.class.getName() ::: " + Test.class.getName()); 

      // Now create an instance of class Test use getClass() 
      Test testObj = new Test(); 
      System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName()); 

      //For primitive type 
      System.out.println("boolean.class.getName() ::: " + boolean.class.getName()); 
      System.out.println("int.class.getName() ::: " + int.class.getName()); 
      System.out.println("char.class.getName() ::: " + char.class.getName()); 
      System.out.println("long.class.getName() ::: " + long.class.getName()); 
     } 
    } 
3

Chỉ cần làm rõ, phương pháp này' .class' không được đề cập đến các tập tin bytecode bạn thấy sau khi biên dịch mã java hay một sự nhầm lẫn giữa các khái niệm về lớp vs Object trong lý thuyết OOP.

Phương thức '.class' này được sử dụng trong Java để phản ánh mã. Nói chung, bạn có thể thu thập dữ liệu meta cho lớp của mình như tên lớp đầy đủ, danh sách các hằng số, danh sách các trường công khai, v.v.

Kiểm tra những liên kết này (đã đề cập ở trên) để có được tất cả các chi tiết:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

Thông thường bạn không có kế hoạch về việc sử dụng Reflection ngay lập tức khi bạn bắt đầu xây dựng dự án của bạn. Đó là điều mà bạn biết bạn cần sau khi cố gắng quản lý mã đang hoạt động. Nhiều lần bạn cần nó để quản lý nhiều trường hợp của chương trình của bạn. Có thể bạn muốn xác định từng 'bản sao' cụ thể để xác định xem một cái gì đó đã được xác định hay đếm số hàm hay chỉ đơn giản là ghi lại chi tiết của một cá thể cụ thể của lớp của bạn.

0

Một lớp chữ là một biểu thức bao gồm tên của một lớp, giao diện, mảng hoặc kiểu nguyên thủy hoặc khoảng trống giả, theo sau là dấu '.' và lớp mã thông báo. Một trong những thay đổi trong JDK 5.0 là rằng java.lang.Class lớp là chung chung, java.lang.Class Class<T>, do đó:

Class<Print> p = Print.class; 

Tài liệu tham khảo ở đây:

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

http://docs.oracle.com/javase/tutorial/extra/generics/literals.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2

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