Kelas anonim adalah kelas yang tidak dapat memiliki nama, sehingga tidak ada cara untuk mereferensikannya. Mereka harus dideklarasikan sebagai bagian dari pernyataan baru pada saat pembuatan. Hal ini memerlukan bentuk lain dari pernyataan baru, sebagai berikut: <kelas atau antarmuka> baru <badan kelas> Bentuk pernyataan baru ini mendeklarasikan kelas anonim baru yang memperluas kelas tertentu atau mengimplementasikan antarmuka tertentu. Itu juga membuat instance baru dari kelas itu dan mengembalikannya sebagai hasil pernyataan. Kelas yang akan diperluas dan antarmuka yang akan diimplementasikan adalah operan dari pernyataan baru, diikuti oleh isi kelas anonim. Jika kelas anonim memperluas kelas lain, badannya dapat mengakses anggota kelas, mengganti metodenya, dll., sama seperti kelas standar lainnya. Jika kelas anonim mengimplementasikan sebuah antarmuka, tubuhnya harus mengimplementasikan metode antarmuka tersebut.
kode java
Copy kode kodenya sebagai berikut:
antarmuka pr
{
batal cetak1();
}
kelas publik noNameClass
{
tujuan pr publik()
{
kembalikan pr baru(){
kekosongan publik print1()
{
System.out.println("Halo dunia!!");
}
};
}
public static void main(String args[])
{
noNameClass c = noNameClass baru();
pr hw=c.dest();
hw.print1();
}
}
PR juga bisa berupa kelas, tetapi metode yang Anda panggil secara eksternal harus dideklarasikan di kelas atau antarmuka Anda. Metode di dalam kelas anonim tidak dapat dipanggil dari luar.
Mungkin tempat yang paling umum digunakan untuk kelas anonim internal di Java adalah dengan menambahkan Listner ke Frame.
sebagai berikut:
kode java
Copy kode kodenya sebagai berikut:
import java.awt.*;
import java.awt.event.*;
QFrame kelas publik memperluas Bingkai {
QFrame publik() {
this.setTitle(/"aplikasi saya/");
addWindowListener(WindowAdapter baru() {
jendela kekosongan publikPenutupan(WindowEvent e) {
membuang();
Sistem.keluar(0);
}
});
this.setBounds(10,10,200,200);
}
}
Kelas anonim internal adalah untuk membuat kelas internal, tetapi tidak memberi Anda nama, artinya tidak ada variabel yang merujuk ke instance tersebut.
Copy kode kodenya sebagai berikut:
Adaptor Jendela baru() {
jendela kekosongan publikPenutupan(WindowEvent e) {
membuang();
Sistem.keluar(0);
}
}
new adalah membuat objek WindowAdapter, dan {} berikut menunjukkan bahwa operasi dalam tanda kurung bertindak berdasarkan nama objek default, dan berikut ini dalam program Java di atas adalah isi fungsi.
Tujuan penggunaan ini adalah untuk membuat instance suatu objek dan mengganti salah satu fungsinya. Anda dapat menemukannya dengan membuka kode WindowAdapter. Ini adalah kelas abstrak. Ini adalah implementasi dari antarmuka WindowListener. Parameter Frame.addWindowListner(); adalah WindowListner, dan implementasinya adalah meneruskan kelas anonim yang berasal dari WindowAdapter.
1. Bagaimana cara menentukan keberadaan kelas anonim? Saya tidak bisa melihat namanya, rasanya itu hanya objek yang dibuat baru dari kelas induk, dan tidak ada nama untuk kelas anonim.
Mari kita lihat pseudocodenya terlebih dahulu
Copy kode kodenya sebagai berikut:
kelas abstrak Ayah(){
....
}
Tes kelas publik{
Ayah f1 = Ayah baru(){ .... } //Ada kelas dalam anonim di sini
}
Secara umum, ketika sebuah objek baru, harus ada titik koma setelah tanda kurung, yaitu pernyataan tentang objek baru berakhir.
Namun berbeda jika ada kelas dalam anonim. Tanda kurung diikuti dengan tanda kurung kurawal, dan tanda kurung kurawal berisi metode implementasi spesifik dari objek baru.
Karena kita tahu bahwa kelas abstrak tidak bisa langsung menjadi baru. Harus ada kelas implementasi sebelum kita bisa membuat kelas implementasi baru.
Pseudocode di atas menunjukkan bahwa new adalah kelas implementasi dari Ayah, dan kelas implementasi ini adalah kelas dalam anonim.
Faktanya, pemisahan kelas dalam anonim di atas bisa dilakukan
Copy kode kodenya sebagai berikut:
kelas SonOne memperluas Ayah{
...//Kode di sini sama dengan inner class anonim di atas, kode dalam tanda kurung kurawal
}
Tes kelas publik{
Ayah f1 = SonOne baru();
}
2. Tindakan pencegahan untuk kelas dalam anonim Perhatikan bahwa deklarasi kelas anonim dilakukan pada waktu kompilasi, dan pembuatan instance dilakukan pada waktu proses. Ini berarti bahwa pernyataan baru dalam perulangan for akan membuat beberapa instance dari kelas anonim yang sama, daripada membuat satu instance dari beberapa kelas anonim yang berbeda.
Saat menggunakan kelas dalam anonim, ingatlah prinsip-prinsip berikut:
・Kelas dalam anonim tidak boleh memiliki konstruktor.
・Kelas dalam anonim tidak dapat mendefinisikan anggota, metode, dan kelas statis apa pun.
・Kelas dalam anonim tidak boleh bersifat publik, dilindungi, pribadi, atau statis.
・Hanya satu instance dari kelas dalam anonim yang dapat dibuat.
・Kelas dalam anonim harus berada di belakang yang baru, dan digunakan untuk mengimplementasikan antarmuka atau mengimplementasikan kelas secara implisit.
・Karena kelas dalam anonim adalah kelas dalam lokal, semua pembatasan pada kelas dalam lokal akan berlaku pada kelas dalam tersebut.
・Kelas dalam hanya dapat mengakses variabel statis atau metode statis kelas luar.
ini di kelas anonim dan kelas dalam:
Terkadang, kita akan menggunakan beberapa kelas dalam dan kelas anonim. Saat menggunakan ini di kelas anonim, ini mengacu pada kelas anonim atau kelas dalam itu sendiri. Saat ini, jika kita ingin menggunakan metode dan variabel kelas eksternal, kita harus menambahkan nama kelas dari kelas eksternal tersebut.
3. Peran kelas dalam anonim
Kelas dalam Java pada dasarnya berbeda dari kelas bersarang di C++: Kelas bersarang C++ tidak memiliki pegangan untuk kelas pembungkus. Ini hanya mengungkapkan konsep enkapsulasi; tetapi kelas dalam Java berbeda, ia dapat mengakses anggota kelas pembungkus (yang berarti ia memiliki pegangan pada kelas pembungkus).
Kelas dalam anonim adalah cara yang disederhanakan untuk menulis kelas dalam: return new Wrapper {
...
};
Setara dengan: Wrapped extends Wrapper {
...
}
kembalikan yang baru Dibungkus();
Apakah ini satu-satunya peran kelas dalam anonim?
Pertimbangkan kasus ini:
Copy kode kodenya sebagai berikut:
antarmuka ICount {
int hitungan();
}
kelas Induk {
ke dalam saya = 0;
ke dalam hitungan() {
kembalikan saya++;
}
}
Ada kelas Anak, yang tidak hanya ingin mewarisi metode count() dari Induk, tetapi juga ingin mengimplementasikan metode hitungan di antarmuka ICount. Apa yang harus saya lakukan saat ini? Kelas dalam dapat ikut berperan:
Copy kode kodenya sebagai berikut:
kelas Anak memperluas Induk {
ICount getCount() {
kembalikan ICcount baru {
ke dalam saya = 0;
ke dalam hitungan() {
kembali (saya *= 2);
}
}
}
}
lihat kode ini
Copy kode kodenya sebagai berikut:
public static void main(String[] args) {
theApp = Penganalisis baru();
SwingUtilities.invokeLater(new Runnable() { // Kelas Runnable Anonim
// objek
public void run() {// Jalankan metode yang dieksekusi di thread
theApp.creatGUI(); // Panggil pembuat GUI statis
}
});
}
public static void main(String[] args) {
theApp = new Analyzer(); // Membuat objek
SwingUtilities.invokeLater(new Runnable() { // Kelas Runnable Anonim
// Kelas dalam anonim yang mengimplementasikan thread
// Awalnya metode ini meneruskan parameter tipe Runnable // Ini dapat dicapai melalui metode kelas anonim ini
// objek
public void run() {// Jalankan metode yang dieksekusi di thread
theApp.creatGUI(); // Panggil pembuat GUI statis
}
});
}