Java Inner Class, konsep serupa juga ditemukan di C ++, yaitu kelas bersarang. Pada pandangan pertama, kelas internal mungkin tampak agak berlebihan, dan kegunaannya mungkin tidak terlalu penting bagi pemula, tetapi dengan pemahaman mendalam tentang hal itu, Anda akan menemukan bahwa perancang Java memang bermaksud baik di kelas internal. Belajar menggunakan kelas internal adalah bagian dari penguasaan pemrograman Java canggih, yang memungkinkan Anda merancang struktur program Anda secara lebih elegan. Berikut ini diperkenalkan dari aspek -aspek berikut:
Pertemuan pertama
konten antarmuka publik {int value ();} tujuan antarmuka publik {string readLabel ();} barang kelas publik {private class konten mengimplementasikan konten {private int i = 11; nilai int int () {return i; }} kelas yang dilindungi Gdestination mengimplementasikan tujuan {label string privat; private gdestination (string whereto) {label = whereto; } public String readLabel () {return label; }} dest dest dest (string s) {return baru gdestination (s); } konten public konten () {return content baru (); }} kelas testgoods {public static void main (string [] args) {barang p = barang baru (); Isi c = p.cont (); Tujuan d = p.dest ("Beijing"); }}Dalam contoh ini, konten kelas dan gdestinasi didefinisikan di dalam barang kelas, dan masing -masing telah melindungi dan pengubah pribadi untuk mengontrol tingkat akses. Konten mewakili isi barang, sedangkan gdestinasi mewakili tujuan barang. Mereka masing -masing menerapkan dua konten antarmuka dan tujuan. Dalam metode utama di bawah ini, gunakan konten C dan tujuan D secara langsung untuk beroperasi, dan Anda bahkan tidak melihat nama -nama dua kelas internal ini! Dengan cara ini, manfaat pertama dari kelas internal tercermin - menyembunyikan operasi yang tidak ingin Anda ketahui orang lain, yaitu, enkapsulasi.
Pada saat yang sama, kami juga menemukan metode pertama untuk mendapatkan objek kelas dalam di luar ruang lingkup kelas eksternal, yaitu, untuk menggunakan metode kelas eksternal untuk membuat dan mengembalikan. Beginilah metode cont () dan dest () dalam contoh di atas. Jadi, apakah ada cara lain? Tentu saja, format sintaks adalah sebagai berikut:
outerObject = OutClass baru (parameter konstruktor); outerclass.innerclass innerObject = outerObject.new innerclass (parameter konstruktor);
Perhatikan bahwa saat membuat objek kelas dalam non-statis, Anda harus terlebih dahulu membuat objek kelas luar yang sesuai. Adapun alasannya, itu juga mengarah ke topik kami berikutnya-
Objek kelas dalam non-statis memiliki referensi ke objek kelas luarnya
Sedikit modifikasi pada contoh sekarang:
Barang kelas publik {private valuerate = 2; Konten kelas pribadi mengimplementasikan konten {private int i = 11*valuerate; nilai int int () {return i; }} kelas yang dilindungi Gdestination mengimplementasikan tujuan {label string privat; private gdestination (string whereto) {label = whereto; } public String readLabel () {return label; }} dest dest dest (string s) {return baru gdestination (s); } konten public konten () {return content baru (); }}Bagian yang dimodifikasi ditampilkan dalam warna merah. Di sini kami menambahkan variabel anggota pribadi penilai ke kelas barang, yang berarti koefisien nilai barang. Lipat gandakan saat nilai metode konten kelas internal () menghitung nilai. Kami menemukan bahwa nilai () dapat mengakses Valuerate, yang juga merupakan manfaat kedua dari kelas dalam - objek kelas dalam dapat mengakses konten objek kelas eksternal yang membuatnya, bahkan termasuk variabel pribadi! Ini adalah fitur yang sangat berguna yang memberi kita lebih banyak ide dan jalan pintas saat mendesain. Untuk mengimplementasikan fungsi ini, objek kelas dalam harus memiliki referensi ke objek kelas luar. Ketika kompiler Java membuat objek kelas internal, secara implisit memberikan referensi ke objek kelas eksternal dan menyimpannya sepanjang waktu. Ini memungkinkan objek kelas dalam untuk selalu mengakses objek kelas eksternal mereka, yang juga mengapa di luar ruang lingkup tindakan kelas eksternal, objek kelas eksternal harus dibuat terlebih dahulu.
Beberapa orang mungkin bertanya, bagaimana jika variabel anggota di kelas dalam sama dengan variabel anggota di kelas luar, yaitu variabel anggota dengan nama yang sama di kelas luar diblokir? Tidak apa -apa, Java menggunakan format berikut untuk mengekspresikan referensi ke kelas eksternal:
outerclass. Ini
Dengan itu, kami tidak takut dengan situasi pemblokiran seperti itu.
Kelas Dalam Statis
Seperti kelas biasa, kelas dalam juga bisa statis. Namun, dibandingkan dengan kelas dalam non-statis, perbedaannya adalah bahwa kelas dalam statis tidak memiliki referensi ke luar. Ini sebenarnya sangat mirip dengan kelas bersarang di C ++. Perbedaan terbesar antara kelas internal Java dan kelas bersarang C ++ adalah apakah ada referensi ke luar. Tentu saja, ada perbedaan dari perspektif desain dan beberapa detailnya.
Selain itu, di kelas dalam non-statis, tidak ada data statis, metode statis, atau kelas dalam statis lainnya (kelas dalam dapat bersarang lebih dari satu lapisan). Namun, kelas dalam statis dapat memiliki semua ini. Ini juga perbedaan kedua antara keduanya.
Kelas internal lokal
Ya, kelas internal Java juga bisa bersifat lokal, dan mereka dapat didefinisikan dalam metode atau bahkan blok kode.
Public Class Goods1 {Public Destination Dest (String S) {class gDestination mengimplementasikan tujuan {private string label; private gdestination (string whereto) {label = whereto; } public String readLabel () {return label; }} mengembalikan gdestinasi baru; } public static void main (string [] args) {goods1 g = boods1 (); Tujuan d = g.dest ("beijing"); }}Ini adalah contoh di atas. Dalam metode DEST kita mendefinisikan kelas dalam, dan akhirnya metode ini mengembalikan objek kelas dalam ini. Ini dapat dilakukan jika kita hanya perlu membuat salah satu objeknya dan membuatnya ke luar saat menggunakan kelas dalam. Tentu saja, kelas internal yang didefinisikan dalam metode dapat melakukan diversifikasi desain, dan tujuannya tidak hanya dalam pengertian ini.
Berikut adalah contoh yang lebih aneh:
Public Class Goods2 {private void internalTracking (boolean b) {if (b) {class trackingslip {private string id; Trackingslip (string s) {id = s; } String getSlip () {return id; }} Trackingslip ts = trackingslip baru ("slip"); String s = ts.getSlip (); }} public void track () {internalTracking (true); } public static void main (string [] args) {goods2 g = new goods2 (); g.track (); }}Anda tidak dapat membuat objek kelas dalam ini di luar IF, karena ini di luar cakupannya. Namun, ketika menyusun, pelacakan kelas dalam disusun pada saat yang sama dengan kelas lain, tetapi tidak valid jika melebihi ruang lingkup ini karena ruang lingkupnya sendiri. Terlepas dari ini, tidak ada bedanya dengan kelas dalam lainnya.
Kelas internal anonim
Aturan sintaks kelas internal anonim Java terlihat agak aneh, tetapi seperti array anonim, ketika Anda hanya perlu membuat objek kelas dan tidak dapat menggunakan namanya, menggunakan kelas internal dapat membuat kode terlihat ringkas dan jelas. Aturan sintaksinya adalah sebagai berikut:
new interfacename () {......}; atau superclassName baru () {......};Mari terus memberi contoh:
Public Class Goods3 {Public Contents Content () {return new Content () {private int i = 11; nilai int int () {return i; }}; }}Di sini, metode cont () menggunakan kelas dalam anonim untuk secara langsung mengembalikan objek yang mengimplementasikan kelas konten antarmuka, yang terlihat sangat ringkas.
Di adaptor anonim untuk pemrosesan acara di Java, kelas dalam anonim banyak digunakan. Misalnya, ketika Anda ingin menutup jendela, tambahkan kode ini:
frame.addwindowlistener (windowAdapter baru () {public void windowclosing (windowevent e) {system.exit (0);}});Satu hal yang perlu diperhatikan adalah bahwa karena kelas dalam anonim tidak memiliki nama, ia tidak memiliki konstruktor (tetapi jika kelas dalam anonim ini mewarisi kelas induk yang hanya berisi konstruktor dengan argumen, Anda harus membawa parameter ini saat membuatnya, dan menggunakan kata kunci super untuk memanggil konten yang sesuai selama proses implementasi). Jika Anda ingin menginisialisasi variabel anggotanya, ada beberapa cara:
Jika ini adalah kelas dalam suatu metode dalam suatu metode, Anda dapat menggunakan metode ini untuk melewati parameter yang Anda inginkan, tetapi ingat bahwa parameter ini harus dinyatakan final.
Reformasi kelas dalam anonim ke dalam kelas dalam lokal bernama sehingga dapat memiliki konstruktor.
Gunakan blok kode inisialisasi di kelas dalam anonim ini.
Mengapa kelas internal membutuhkan?
Apa manfaat kelas internal Java? Mengapa kelas internal membutuhkan?
Pertama, mari berikan contoh sederhana. Jika Anda ingin menerapkan antarmuka, tetapi satu metode dalam antarmuka ini memiliki nama dan parameter yang sama dengan satu metode di kelas yang Anda bayangkan, apa yang harus Anda lakukan? Saat ini, Anda dapat membuat kelas internal untuk mengimplementasikan antarmuka ini. Karena kelas dalam dapat diakses oleh semua konten kelas luar, hal itu dapat mencapai semua fungsi yang Anda terapkan secara langsung antarmuka ini.
Tetapi Anda mungkin harus mempertanyakan, bukankah cukup untuk mengubah metode ini?
Memang, sangat tidak meyakinkan untuk menggunakan ini sebagai alasan untuk merancang kategori internal.
Alasan sebenarnya adalah bahwa kelas internal dan antarmuka di Java digabungkan untuk memecahkan masalah yang sering dikeluhkan oleh programmer C ++ - tidak ada lagi warisan. Faktanya, multi-warisan C ++ sangat rumit untuk dirancang, dan Java dapat mencapai efek multi-warisan melalui kelas internal dan antarmuka.
Ringkasan Kelas Internal Java
(1) Kelas dalam non-statis yang didefinisikan antara metode:
● Kelas periferal dan internal dapat mengakses anggota pribadi mereka sendiri dari satu sama lain.
● Variabel anggota statis tidak dapat didefinisikan di kelas dalam.
Di luar ruang lingkup kelas eksternal, untuk membuat objek kelas internal, Anda harus terlebih dahulu membuat objek kelas eksternal
(2) Kelas dalam statis yang didefinisikan antara metode:
● Hanya anggota statis dari kelas eksternal yang dapat diakses.
Kelas Dalam Statis tidak memiliki referensi ke luar
(3) Kelas dalam lokal yang didefinisikan dalam metode ini:
● Kelas internal ini tidak memiliki izin kontrol akses
● Kelas periferal tidak dapat melihat kelas dalam lokal dalam metode ini, tetapi kelas dalam setempat dapat mengakses anggota kelas periferal.
● Kelas internal lokal dapat diakses di badan metode, tetapi pernyataan akses harus setelah mendefinisikan kelas internal lokal.
● Kelas internal lokal hanya dapat mengakses konstanta di badan metode, yaitu anggota yang dimodifikasi dengan final.
(4) Kelas dalam anonim yang didefinisikan dalam metode ini:
● Tidak ada konstruktor, sebaliknya meneruskan parameter konstruktor ke konstruktor superclass
Ketika Anda hanya perlu membuat objek kelas dan tidak menggunakan namanya, menggunakan kelas dalam anonim dapat membuat kode terlihat ringkas dan jelas.
Artikel di atas secara komprehensif memahami kelas internal dan anonim di Java adalah semua konten yang telah saya bagikan dengan Anda. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.