. Class có nghĩa là gì trong Java?


149

Không gì .classcó nghĩa là trong Java? Ví dụ, nếu tôi tạo một lớp được gọi là Print. Điều gì Print.classtrở lại?



Tôi sợ tôi không hiểu đầy đủ những gì bạn đang hỏi. Nếu bạn có thể giải thích thêm một chút, ai đó có thể cung cấp cho bạn thông tin hữu ích hơn
Paul Walker

28
Đây chắc chắn trông giống như một câu hỏi thực sự với tôi. Tôi chỉ tự đặt 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 bận tâm nếu tôi biết rằng câu hỏi của tôi không có thật!
Bác sĩ Jones

1
Ngoài ra, tôi nghĩ vì sự vụng về của chuỗi tìm kiếm cụ thể, có rất ít bằng văn bản hoặc có thể tìm thấy về câu hỏi này. Khác với các tài liệu API được liên kết ở trên, tôi chưa bao giờ thấy ký hiệu này được đề cập ở bất kỳ nơi nào khác (mặc dù bạn thường thấy nó được sử dụng trong phản chiếu).
jordanpg

2
@MadProgrammer OP đang hỏi về .classcú pháp chỉ liên quan đến sự .classmở rộng tên tệp.
jordanpg

Câu trả lời:


143

Khi bạn viết .classsau một tên lớp, nó tham chiếu đến lớp chữ - java.lang.Classđối tượng thể hiện thông tin về lớp đã cho.

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

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

2
Một số trong những điều người ta có thể làm với một đối tượng lớp là gì?
Kevin

7
@Kevin Xem tài liệu API cho java.lang.Class .
Patricia Shanahan

Ứng dụng: truy cập các lĩnh vực riêng tư, ví dụ : Writer.class.getDeclaredField("writeBuffer").
jordanpg

2
Vậy các loại là Print.classgì?
Zhipeng YANG

1
Và Android xử lý new Intent(this, Activity.classnhư thế nào? Nó sẽ cố gắng tìm ra class Activitybằng cách so sánh từng lớp?
Zhipeng YANG

56

.class được sử dụng khi không có phiên bản của lớp.

.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());

Điều này sẽ xuất ra:

class java.lang.String

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


7
getClass()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.classcó thể được sử dụng ngay cả khi lớp không có phiên bản. Ví dụ, xem xét Math.class. Mỗi cái đều đúng cho những tình huống nhất định.
Patricia Shanahan

Rực rỡ giải thích. Đúng với quan điểm của nó. Làm thế nào bạn xác định được sự khác biệt giữa .class.getClass().
Sevastyan Savanyuk

6

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

các .classcú pháp

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

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

Class c = boolean.class;  // correct

Xem: docs.oracle.com về lớp học


6

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

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

Kiểm tra các liên kết này (đã được đề 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 sử dụng Reflection ngay khi bạn bắt đầu xây dựng dự án của mình. Đó là thứ bạn biết bạn cần sau khi cố gắng quản lý mã đã hoạt động. Nhiều lần bạn cần nó để quản lý nhiều phiên bản 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 chưa, hoặc đếm số lượng hàm, hoặc chỉ đơn giản là ghi nhật ký chi tiết của một thể hiện cụ thể của lớp bạn.


3

Nếu không có sẵn phiên bản thì .classcú pháp được sử dụng để lấy đối tượng Class tương ứng cho một lớp nếu không bạn có thể sử dụng phương thức getClass () để lấy đối tượng Class. Vì không có kiểu dữ liệu nguyên thủy, chúng ta phải sử dụng .classcú pháp cho 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());
       }
    }

1

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


4
in a fully object-oriented language, a Class is also an Object? <cần dẫn nguồn>
Sam Dufel 4/12/14

0

Một nghĩa đen của lớp 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 kiểu giả, theo sau là một '.' và lớp mã thông báo. Một trong những thay đổi trong JDK 5.0 là lớp java.lang.Class là chung java.lang.Class Class<T>, do đó:

Class<Print> p = Print.class;

Tham khảo tại đâ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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.