ที่นี่ฉันกำลังสร้างตัวอย่างของชั้นเรียนของฉัน
ไม่คุณไม่ได้สร้างอินสแตนซ์ของคลาสนามธรรมของคุณที่นี่ แต่คุณกำลังสร้างตัวอย่างของคลาสย่อยที่ไม่ระบุชื่อของคลาสนามธรรมของคุณ และจากนั้นคุณจะถูกเรียกใช้วิธีการบนชั้นนามธรรมชี้การอ้างอิงถึงวัตถุประเภทรอง
พฤติกรรมนี้มีการระบุไว้อย่างชัดเจนในJLS - ส่วน # 15.9.1 : -
ถ้านิพจน์การสร้างคลาสอินสแตนซ์สิ้นสุดลงในเนื้อหาคลาสคลาสที่ถูกอินสแตนซ์นั้นเป็นคลาสที่ไม่ระบุชื่อ แล้ว:
- ถ้า T หมายถึงคลาสคลาสจะมีการประกาศคลาสย่อยโดยตรงแบบไม่ระบุชื่อของคลาสที่ชื่อโดย T มันเป็นข้อผิดพลาดเวลารวบรวมถ้าชั้นแสดงโดย T เป็นชั้นสุดท้าย
- ถ้า T หมายถึงอินเตอร์เฟสดังนั้นคลาสย่อยโดยตรงแบบไม่ระบุชื่อของ Object ที่ใช้อินเตอร์เฟสที่มีชื่อโดย T จะถูกประกาศ
- ในทั้งสองกรณีเนื้อความของคลาสย่อยคือ ClassBody ที่กำหนดในนิพจน์การสร้างอินสแตนซ์ของคลาส
- คลาสที่ถูกอินสแตนซ์เป็นคลาสย่อยที่ไม่ระบุชื่อ
เน้นการขุด
นอกจากนี้ในJLS - มาตรา # 12.5คุณสามารถอ่านข้อมูลเกี่ยวกับขั้นตอนการสร้างวัตถุ ฉันจะอ้างอิงหนึ่งข้อความจากที่นี่: -
เมื่อใดก็ตามที่มีคลาสอินสแตนซ์ใหม่ถูกสร้างขึ้นพื้นที่หน่วยความจำจะถูกจัดสรรให้กับห้องสำหรับตัวแปรอินสแตนซ์ทั้งหมดที่ประกาศในประเภทคลาสและตัวแปรอินสแตนซ์ทั้งหมดที่ประกาศในแต่ละคลาสซูเปอร์คลาสประเภทรวมถึงตัวแปรอินสแตนซ์ทั้งหมด
ก่อนที่การอ้างอิงไปยังวัตถุที่สร้างขึ้นใหม่จะถูกส่งกลับเป็นผลลัพธ์ตัวสร้างที่ระบุจะถูกประมวลผลเพื่อเริ่มต้นวัตถุใหม่โดยใช้ขั้นตอนต่อไปนี้:
คุณสามารถอ่านเกี่ยวกับขั้นตอนทั้งหมดในลิงค์ที่ฉันให้ไว้
หากต้องการดูว่าคลาสที่ถูกสร้างอินสแตนซ์เป็นคลาสย่อยที่ไม่ระบุชื่อคุณเพียงแค่รวบรวมทั้งคลาสของคุณ สมมติว่าคุณใส่คลาสเหล่านั้นเป็นสองไฟล์:
My.java:
abstract class My {
public void myMethod() {
System.out.print("Abstract");
}
}
Poly.java:
class Poly extends My {
public static void main(String a[]) {
My m = new My() {};
m.myMethod();
}
}
ในตอนนี้ให้รวบรวมทั้งซอร์สไฟล์ของคุณ:
javac My.java Poly.java
ตอนนี้ในไดเรกทอรีที่คุณรวบรวมซอร์สโค้ดคุณจะเห็นไฟล์คลาสต่อไปนี้:
My.class
Poly$1.class // Class file corresponding to anonymous subclass
Poly.class
ดูคลาสนั้น - Poly$1.class
. มันเป็นไฟล์คลาสที่สร้างโดยคอมไพเลอร์ที่สอดคล้องกับคลาสย่อยที่ไม่ระบุชื่อที่คุณสร้างอินสแตนซ์โดยใช้รหัสด้านล่าง:
new My() {};
ดังนั้นจึงเป็นที่ชัดเจนว่ามีคลาสอื่นที่กำลังอินสแตนซ์ มันเป็นแค่นั้นคลาสนั้นจะได้รับชื่อหลังจากคอมไพล์โดยคอมไพเลอร์
โดยทั่วไปคลาสย่อยที่ไม่ระบุชื่อทั้งหมดในชั้นเรียนของคุณจะถูกตั้งชื่อตามแบบนี้:
Poly$1.class, Poly$2.class, Poly$3.class, ... so on
ตัวเลขเหล่านั้นแสดงถึงลำดับที่คลาสไม่ระบุชื่อปรากฏในคลาสที่ปิดล้อม
B
จากนามธรรมหนึ่งA
, ในส่วนของการก่อสร้างของB
อินสแตนซ์ซึ่งประกอบด้วยการทำงานของตัวสร้างประเภทรันไทม์ของวัตถุที่เป็นจริงA
A
ชั่วคราวเท่านั้น