ฉันไม่เข้าใจข้อความต่อไปนี้ ... หมายความว่า<clinit>
มีไว้สำหรับตัวสร้างที่ว่างเปล่า? เหตุใดจึงสำคัญที่ต้องมีสองเวอร์ชันที่แตกต่างกัน
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
2.9. Special Methods
ในระดับของเครื่องเสมือน Java ทุกคอนสตรัค (§2.12)
<init>
จะปรากฏขึ้นเป็นวิธีการเริ่มต้นอินสแตนซ์ที่มีชื่อพิเศษ ชื่อนี้จัดทำโดยคอมไพเลอร์ เนื่องจากชื่อ<init>
ไม่ใช่ตัวระบุที่ถูกต้องจึงไม่สามารถใช้โดยตรงในโปรแกรมที่เขียนด้วยภาษาโปรแกรม Java วิธีการเริ่มต้นอินสแตนซ์อาจถูกเรียกใช้เฉพาะภายในเครื่องเสมือน Java โดยคำสั่ง invokespecial และอาจถูกเรียกใช้บนอินสแตนซ์คลาสที่ไม่ได้กำหนดค่าเริ่มต้นเท่านั้น วิธีการเริ่มต้นอินสแตนซ์ใช้สิทธิ์การเข้าถึง (§2.7.4) ของตัวสร้างที่ได้รับมาคลาสหรืออินเทอร์เฟซมีเมธอดการเตรียมใช้งานคลาสหรืออินเตอร์เฟสไม่เกินหนึ่งคลาสและเริ่มต้น (§2.17.4) โดยเรียกใช้เมธอดนั้น วิธีการเริ่มต้นของคลาสหรืออินเทอร์เฟซเป็นแบบคงที่และไม่มีข้อโต้แย้ง
<clinit>
มันมีชื่อพิเศษ ชื่อนี้จัดทำโดยคอมไพเลอร์ เนื่องจากชื่อ<clinit>
ไม่ใช่ตัวระบุที่ถูกต้องจึงไม่สามารถใช้โดยตรงในโปรแกรมที่เขียนด้วยภาษาโปรแกรม Java วิธีการเริ่มต้นคลาสและอินเตอร์เฟสถูกเรียกใช้โดยปริยายโดยเครื่องเสมือน Java พวกเขาจะไม่ถูกเรียกโดยตรงจาก inw2struction เครื่องเสมือน Java ใด ๆ แต่จะถูกเรียกโดยทางอ้อมเท่านั้นซึ่งเป็นส่วนหนึ่งของกระบวนการเริ่มต้นคลาส
CL
?