. class หมายถึงอะไรใน Java


149

อะไร.classหมายถึงใน Java? Printตัวอย่างเช่นถ้าฉันสร้างระดับที่เรียกว่า อะไรPrint.classกลับมา?



ฉันกลัวว่าฉันไม่เข้าใจสิ่งที่คุณถาม หากคุณสามารถอธิบายให้ละเอียดได้มากกว่านี้ใครบางคนอาจให้ข้อมูลที่เป็นประโยชน์กับคุณได้มากกว่านี้
Paul Walker

28
แน่นอนว่านี่เป็นคำถามที่แท้จริงสำหรับฉัน ฉันแค่ถามคำถามนี้ด้วยตัวเองและพบว่าตัวเองอยู่ที่นี่หลังจากการค้นหาโดย Google อย่างรวดเร็ว ฉันเดาว่าฉันไม่ควรกังวลถ้าฉันรู้ว่าคำถามของฉันไม่จริง!
หมอโจนส์

1
นอกจากนี้ฉันคิดว่าเนื่องจากความเชื่องช้าของสตริงการค้นหาเฉพาะทำให้มีคำถามหรือคำถามเกี่ยวกับคำถามนี้เขียนได้เล็กน้อย นอกเหนือจากเอกสาร API ที่เชื่อมโยงกับด้านบนฉันไม่เคยเห็นสัญลักษณ์นี้กล่าวถึงที่อื่น (แม้ว่าคุณมักจะเห็นมันใช้ในการสะท้อน)
jordanpg

2
@MadProgrammer OP กำลังถามเกี่ยวกับ.classไวยากรณ์ที่เกี่ยวข้องเฉพาะกับ.classส่วนขยายชื่อไฟล์โดยบังเอิญ
jordanpg

คำตอบ:


143

เมื่อคุณเขียน.classหลังจากชื่อคลาสมันจะอ้างอิงคลาสตัวอักษร - java.lang.Classวัตถุที่แสดงข้อมูลเกี่ยวกับคลาสที่กำหนด

ตัวอย่างเช่นถ้าระดับของคุณอยู่Printแล้วPrint.classเป็นวัตถุที่แสดงถึงระดับชั้นPrintบนรันไทม์ มันเป็นวัตถุเดียวกันที่ถูกส่งกลับโดยgetClass()วิธีการใด ๆ (โดยตรง) Printตัวอย่างของ

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

2
มีสิ่งใดบ้างที่เราสามารถทำกับคลาสวัตถุได้?
เควิน

7
@ Kevin ดูเอกสาร API สำหรับjava.lang.Class
Patricia Shanahan

แอปพลิเคชัน: เข้าถึงฟิลด์ส่วนตัวเช่น: Writer.class.getDeclaredField("writeBuffer").
jordanpg

2
แล้วประเภทของPrint.classอะไร
Zhipeng YANG

1
และ Android จะจัดการnew Intent(this, Activity.classอย่างไร มันจะพยายามหาclass Activityโดยเปรียบเทียบแต่ละชั้น?
Zhipeng YANG

56

.class จะใช้เมื่อไม่มีอินสแตนซ์ของคลาสที่พร้อมใช้งาน

.getClass() ใช้เมื่อมีอินสแตนซ์ของคลาสที่พร้อมใช้งาน

object.getClass() ส่งคืนชั้นของวัตถุที่กำหนด

ตัวอย่างเช่น:

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

สิ่งนี้จะออก:

class java.lang.String

นี่คือคลาสของวัตถุสตริง :)


7
getClass()มีประโยชน์ก็ต่อเมื่อคุณมีการอ้างอิงที่ชี้ไปยังวัตถุของคลาส ClassName.classสามารถใช้ได้แม้ว่าคลาสจะไม่มีกรณี Math.classตัวอย่างเช่นพิจารณา แต่ละอย่างถูกต้องสำหรับบางสถานการณ์
Patricia Shanahan

คำอธิบายที่ยอดเยี่ยม ไปถึงจุดที่ต้องการความแตกต่างระหว่าง.classและ.getClass().
Sevastyan Savanyuk

6

หากมีวัตถุของอินสแตนซ์อยู่วิธีที่ง่ายที่สุดในการเรียกคลาสนั้นคือการเรียกใช้ Object.getClass()

.classไวยากรณ์

หากชนิดนั้นพร้อมใช้งาน แต่ไม่มีอินสแตนซ์ดังนั้นจึงเป็นไปได้ที่จะได้รับคลาสโดยการต่อท้าย.classชื่อของประเภท นี่เป็นวิธีที่ง่ายที่สุดในการรับ Class สำหรับประเภทดั้งเดิม

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

Class c = boolean.class;  // correct

ดู: docs.oracle.com เกี่ยวกับชั้นเรียน


6

เพื่อชี้แจงวิธี '.class' นี้ไม่ได้อ้างถึงไฟล์ bytecode ที่คุณเห็นหลังจากรวบรวมรหัส java หรือความสับสนระหว่างแนวคิดของ Class vs. Object ในทฤษฎี OOP

เมธอด '.class' นี้ใช้ใน Java สำหรับโค้ด Reflection โดยทั่วไปคุณสามารถรวบรวมข้อมูล meta สำหรับคลาสของคุณเช่นชื่อคลาสแบบเต็ม, รายการค่าคงที่, รายชื่อเขตข้อมูลสาธารณะ ฯลฯ

ตรวจสอบลิงก์เหล่านี้ (ดังกล่าวข้างต้น) เพื่อรับรายละเอียดทั้งหมด:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html

โดยปกติคุณไม่ได้วางแผนที่จะใช้ Reflection ทันทีเมื่อคุณเริ่มสร้างโครงการ เป็นสิ่งที่คุณรู้ว่าคุณต้องการหลังจากพยายามจัดการรหัสที่ใช้งานได้แล้ว หลายครั้งที่คุณต้องการให้มันจัดการโปรแกรมของคุณหลายอินสแตนซ์ บางทีคุณอาจต้องการระบุ 'โคลน' แต่ละอันเพื่อพิจารณาว่ามีบางสิ่งที่กำหนดไว้แล้วหรือนับจำนวนฟังก์ชั่นหรือเพียงแค่บันทึกรายละเอียดของอินสแตนซ์เฉพาะของชั้นเรียนของคุณ


3

ถ้าไม่มีอินสแตนซ์ให้ใช้.classไวยากรณ์จะได้รับวัตถุคลาสที่สอดคล้องกันสำหรับคลาสมิฉะนั้นคุณสามารถใช้วิธี getClass () เพื่อรับวัตถุคลาส เนื่องจากไม่มีอินสแตนซ์ของชนิดข้อมูลดั้งเดิมเราจึงต้องใช้.classไวยากรณ์สำหรับชนิดข้อมูลดั้งเดิม

    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

ฉันคิดว่ากุญแจสำคัญในที่นี้คือการเข้าใจความแตกต่างระหว่างคลาสและวัตถุ วัตถุเป็นตัวอย่างของการเรียน. แต่ในภาษาเชิงวัตถุทั้งหมดClass ก็เป็น Objectด้วยเช่นกัน ดังนั้นการโทร.classจะได้รับการอ้างอิงไปยังวัตถุ Class ของ Class นั้นซึ่งสามารถจัดการได้


4
in a fully object-oriented language, a Class is also an Object? <อ้างถึง>
Sam Dufel

0

คลาสตัวอักษรคือนิพจน์ที่ประกอบด้วยชื่อของคลาสอินเทอร์เฟซอาร์เรย์หรือชนิดดั้งเดิมหรือเป็นโมฆะหลอกชนิดตามด้วย '.' และชั้นโทเค็น หนึ่งในการเปลี่ยนแปลงใน JDK 5.0 คือคลาส java.lang.Class เป็นแบบทั่วไปjava.lang.Class Class<T>ดังนั้น:

Class<Print> p = Print.class;

การอ้างอิงที่นี่:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.