java中的匿名内部类总结
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
实例1:不使用匿名内部类来实现抽象方法
abstract class Person { public abstract void eat(); } class Child extends Person { public void eat() { System.out.println("eat something"); } } public class Demo { public static void main(String[] args) { Person p = new Child(); p.eat(); } }
运行结果:eat something
可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用
但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?
这个时候就引入了匿名内部类
实例2:匿名内部类的基本实现
abstract class Person { public abstract void eat(); } public class Demo { public static void main(String[] args) { Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); } }
运行结果:eat something
可以看到,我们直接将抽象类Person中的方法在大括号中实现了
这样便可以省略一个类的书写
并且,匿名内部类还能用于接口上
实例3:在接口上使用匿名内部类
interface Person { public void eat(); } public class Demo { public static void main(String[] args) { Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); } }
运行结果:eat something
由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现
最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口
实例4:Thread类的匿名内部类实现
public class Demo { public static void main(String[] args) { Thread t = new Thread() { public void run() { for (int i = 1; i <= 5; i++) { System.out.print(i + " "); } } }; t.start(); } }
运行结果:1 2 3 4 5
实例5:Runnable接口的匿名内部类实现
public class Demo { public static void main(String[] args) { Runnable r = new Runnable() { public void run() { for (int i = 1; i <= 5; i++) { System.out.print(i + " "); } } }; Thread t = new Thread(r); t.start(); } }
运行结果:1 2 3 4 5

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Kelas dalaman tanpa nama boleh menyebabkan kebocoran memori Masalahnya ialah mereka memegang rujukan kepada kelas luar, menghalang kelas luar daripada dikumpul. Penyelesaian termasuk: 1. Gunakan rujukan yang lemah Apabila kelas luar tidak lagi dipegang oleh rujukan yang kuat, pemungut sampah akan segera mengitar semula objek rujukan yang lemah memerlukan ingatan semasa pengumpulan sampah Hanya kemudian objek rujukan lembut dikitar semula. Dalam pertempuran sebenar, seperti dalam aplikasi Android, masalah kebocoran memori yang disebabkan oleh kelas dalaman tanpa nama boleh diselesaikan dengan menggunakan rujukan yang lemah, supaya kelas dalaman tanpa nama boleh dikitar semula apabila pendengar tidak diperlukan.

Kelas dalaman tanpa nama ialah kelas dalaman khas dalam Java yang tidak mempunyai nama eksplisit dan dicipta melalui ungkapan baharu Ia digunakan terutamanya untuk melaksanakan antara muka tertentu atau melanjutkan kelas abstrak dan digunakan serta-merta selepas penciptaan. Corak reka bentuk kelas dalaman tanpa nama biasa termasuk: Corak penyesuai: menukar satu antara muka kepada antara muka yang lain. Corak Strategi: Mentakrifkan dan Menggantikan Algoritma. Corak pemerhati: Daftar pemerhati dan kendalikan peristiwa. Ia sangat berguna dalam aplikasi praktikal, seperti menyusun TreeSet mengikut panjang rentetan, mencipta benang tanpa nama, dsb.

Kelas dalaman tanpa nama digunakan di Java sebagai kelas dalaman khas yang memudahkan subkelas, memudahkan kod dan mengendalikan acara (seperti klik butang). Kes praktikal termasuk: Pengendalian acara: Gunakan kelas dalaman tanpa nama untuk menambah pendengar acara klik untuk butang. Transformasi data: Isih koleksi menggunakan kaedah Collections.sort dan kelas dalaman tanpa nama sebagai pembanding.

Kelas dalaman tanpa nama tidak sesuai digunakan apabila: perlu mengakses ahli persendirian, memerlukan berbilang contoh, memerlukan warisan, perlu mengakses jenis generik

Ralat penggunaan kelas dalaman tanpa nama: Mengakses pembolehubah di luar skop menggunakan menangkap pengecualian yang tidak diisytiharkan dalam persekitaran bukan benang selamat

Masalah prestasi kelas dalaman tanpa nama ialah ia dicipta semula setiap kali ia digunakan, yang boleh dioptimumkan melalui strategi berikut: 1. Simpan kelas dalaman tanpa nama dalam pembolehubah tempatan 2. Gunakan kelas dalaman bukan statik; ungkapan. Ujian praktikal menunjukkan bahawa pengoptimuman ekspresi lambda mempunyai kesan terbaik.

Jangka hayat kelas dalam tanpa nama ditentukan oleh skopnya: Kaedah-kelas dalam tempatan: Sah hanya dalam skop kaedah yang menciptanya. Kelas dalaman pembina: terikat kepada contoh kelas luar dan dikeluarkan apabila tika kelas luar dikeluarkan. Kelas dalaman statik: dimuatkan dan dipunggah pada masa yang sama dengan kelas luaran.

Kelas dalaman tanpa nama memudahkan penciptaan kod berbilang benang, menghapuskan keperluan untuk menamakan dan mendayakan definisi segera dan penggunaan kelas benang. Kelebihan utama adalah untuk memudahkan kod, manakala hadnya ialah ia tidak boleh dilanjutkan. Gunakan apabila anda perlu membuat satu atau dua benang dengan cepat. Jika logik yang lebih kompleks diperlukan, fail kelas yang berasingan harus dibuat.
