Di sini, saya membuat instance dari kelas saya
Tidak, Anda tidak membuat instance dari kelas abstrak Anda di sini. Alih-alih, Anda membuat instance dari subclass anonim dari kelas abstrak Anda. Dan kemudian Anda memohon metode pada Anda referensi kelas abstrak menunjuk ke objek subclass .
Perilaku ini jelas tercantum dalam JLS - Bagian # 15.9.1 : -
Jika ekspresi penciptaan instance kelas berakhir dengan tubuh kelas, maka kelas yang dipakai adalah kelas anonim. Kemudian:
- Jika T menunjukkan kelas, maka subclass langsung anonim dari kelas yang dinamai oleh T dinyatakan. Ini adalah kesalahan waktu kompilasi jika kelas yang dilambangkan dengan T adalah kelas akhir.
- Jika T menunjukkan antarmuka, maka subclass langsung anonim Obyek yang mengimplementasikan antarmuka bernama T dinyatakan.
- Dalam kedua kasus, tubuh subclass adalah ClassBody yang diberikan dalam ekspresi pembuatan instance kelas.
- Kelas yang dipakai adalah subclass anonim.
Tekankan milikku.
Juga, di JLS - Bagian # 12.5 , Anda dapat membaca tentang Proses Pembuatan Objek . Saya akan mengutip satu pernyataan dari itu di sini: -
Setiap kali instance kelas baru dibuat, ruang memori dialokasikan untuknya dengan ruang untuk semua variabel instance yang dideklarasikan dalam tipe kelas dan semua variabel instance dideklarasikan dalam setiap superclass dari tipe kelas, termasuk semua variabel instance yang mungkin disembunyikan.
Tepat sebelum referensi ke objek yang baru dibuat dikembalikan sebagai hasilnya, konstruktor yang ditunjukkan diproses untuk menginisialisasi objek baru menggunakan prosedur berikut:
Anda dapat membaca tentang prosedur lengkap pada tautan yang saya berikan.
Untuk secara praktis melihat bahwa kelas yang dipakai adalah SubClass Anonim , Anda hanya perlu mengkompilasi kedua kelas Anda. Misalkan Anda meletakkan kelas-kelas itu dalam dua file yang berbeda:
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();
}
}
Sekarang, kompilasi kedua file sumber Anda:
javac My.java Poly.java
Sekarang di direktori tempat Anda menyusun kode sumber, Anda akan melihat file kelas berikut:
My.class
Poly$1.class // Class file corresponding to anonymous subclass
Poly.class
Lihat kelas itu - Poly$1.class
. Ini adalah file kelas yang dibuat oleh kompiler yang sesuai dengan subkelas anonim yang Anda instantiated menggunakan kode di bawah ini:
new My() {};
Jadi, jelas bahwa ada kelas yang berbeda sedang dipakai. Hanya saja, kelas itu diberi nama hanya setelah kompilasi oleh kompiler.
Secara umum, semua subclass anonim di kelas Anda akan dinamai dengan cara ini:
Poly$1.class, Poly$2.class, Poly$3.class, ... so on
Angka-angka itu menunjukkan urutan di mana kelas-kelas anonim muncul di kelas terlampir.
B
dari satu abstrakA
, selama bagian konstruksi dariB
contoh, yang terdiri menjalankanA
's konstruktor, objek jenis runtime sebenarnyaA
. Namun hanya sementara.