kelas tertutup ialah ciri yang sebelum ini diperkenalkan dalam JDK 15 dan secara rasmi dalam JDK 17. kelas tertutup ialah kelas yang tidak boleh dilanjutkan oleh kelas yang tidak dibenarkan secara eksplisit (dalam pengisytiharan kelas), jadi bilangan subkelas adalah terhad dan diketahui lebih awal.
Ia bertujuan untuk membenarkan kawalan yang lebih tepat ke atas hierarki warisan, serta memudahkan pemodelan domain di mana semua kemungkinan subkelas diketahui, dan meningkatkan keselamatan dan kebolehselenggaraan kod.
Perbezaan antara kelas tertutup dan kelas jenis akhir ialah kelas terakhir tidak boleh dilanjutkan oleh mana-mana kelas, manakala kelas tertutup boleh dilanjutkan dengan bilangan terhad daripada kelas.
Pengisytiharan kelas tertutup
Andaikan kita mempunyai dua kelas, kelas Shape dan kelas Circle, kedua-duanya adalah kelas biasa, jadi Shape boleh dilanjutkan oleh mana-mana kelas.
public class Shape { // ... } public class Circle extends Shape { // ... }
Jika kita menggunakan kata kunci akhir dalam kelas Shape, maka ia tidak boleh dilanjutkan oleh mana-mana kelas.
public final class Shape { // ... } public class Circle extends Shape { // Error // ... }
Sekarang, jika kita mahu kelas Shape dilanjutkan hanya oleh kelas tertentu (contohnya, Bulatan dan Square), maka kita boleh mengisytiharkannya sebagai kelas tertutup.
public sealed class Shape permits Circle, Square { // ... }
Menganalisis pengisytiharan sebelumnya, kami melihat bahawa adalah perlu untuk meletakkan dimeterai sebelum kelas perkataan untuk menunjukkan bahawa ia adalah kelas tertutup. Kemudian, perkataan permit digunakan diikuti dengan senarai kelas yang boleh melanjutkan kelas semasa, dalam contoh di atas, hanya kelas Bulatan dan Square boleh melanjutkan kelas Bentuk.
Perkara yang sama berlaku jika anda bekerja dengan kelas jenis abstrak, iaitu, kelas yang tidak boleh digunakan, tetapi boleh dilanjutkan oleh kelas lain.
public sealed abstract class Shape permits Circle, Square { // ... }
Konsep ini juga boleh digunakan pada antara muka.
public sealed interface Shape permits Circle, Square { // ... }
Nota: Subkelas yang dibenarkan mesti berada dalam modul atau pakej yang sama dengan kelas dimeterai, jika tidak, mesej ralat akan dipaparkan.
Kelas yang dibenarkan
Setelah kelas diisytiharkan dimeterai dan kelas yang dibenarkan telah ditentukan, apabila melanjutkan kelas Shape dengan kelas yang dibenarkan (dengan meletakkan extends Shape) IDE akan memaparkan mesej ralat yang serupa dengan ini Pengubah suai 'dimeterai' , 'tidak dimeterai' atau 'akhir' dijangka, Apakah maksudnya?.
Perlu diambil kira bahawa setiap kelas yang dibenarkan (subkelas) mesti diisytiharkan dengan salah satu daripada kata kunci berikut:
- akhir: Menunjukkan bahawa kelas tidak boleh dilanjutkan.
- dimeterai: Menunjukkan bahawa kelas ialah kelas tertutup dan ia telah membenarkan subkelas.
- tidak dimeterai: Menunjukkan bahawa kelas itu bukan kelas tertutup dan ia boleh dilanjutkan oleh mana-mana kelas.
Untuk mempraktikkan perkara di atas, mari kita bekerjasama dengan kelas Shape dan kelas Bulatan, Square dan Triangle untuk melihat cara kelas yang dibenarkan boleh diisytiharkan mengikut apa yang dinyatakan di atas.
public class Shape { // ... } public class Circle extends Shape { // ... }
Kelas bulatan - akhir
Jika kita mahu kelas Bulatan menjadi jenis terakhir dan akibatnya tidak boleh dilanjutkan, maka ia mesti diisytiharkan seperti berikut:
public final class Shape { // ... } public class Circle extends Shape { // Error // ... }
Ini menghalang kelas Bulatan daripada dilanjutkan oleh mana-mana kelas lain.
Kelas persegi - dimeterai
Jika kita mahu kelas Square mempunyai jenis yang dimeterai dan telah membenarkan subkelas yang boleh memanjangkannya, maka ia mesti diisytiharkan seperti berikut:
public sealed class Shape permits Circle, Square { // ... }
Untuk contoh ini, setiap kelas yang dibenarkan (SquareChild1 dan SquareChild2) diisytiharkan sebagai jenis muktamad supaya mereka tidak boleh dilanjutkan oleh mana-mana kelas lain.
public sealed abstract class Shape permits Circle, Square { // ... }
Jika anda mahu kelas ini boleh dilanjutkan oleh lebih banyak kelas, maka kelas itu hendaklah diisytiharkan sebagai dimeterai atau boleh dilanjutkan oleh mana-mana kelas yang tidak dimeterai.
Kelas segi tiga - tidak bertutup
Dalam kes kelas Triangle, apabila ia diisytiharkan tidak dimeterai, ia membenarkan kelas ini dilanjutkan oleh mana-mana kelas lain, tanpa perlu menyatakan kelas yang dibenarkan.
public sealed interface Shape permits Circle, Square { // ... }
Sebagai contoh, jika anda mencipta kelas TriangleChild yang memanjangkan Triangle, tiada mesej ralat akan dipaparkan.
public sealed class Shape permits Circle, Square, Triangle { // ... }
Pada ketika ini adalah penting untuk mempertimbangkan bahawa jika anda mengisytiharkan kelas sebagai tidak dimeterai anda "break" dengan cara tertentu tujuan kelas tertutup, kerana ia membenarkan kelas ini dilanjutkan oleh mana-mana kelas lain dan bilangan subkelas yang dibenarkan tidak terhad.
Bolehkah rekod menjadi kelas tertutup?
Untuk bahagiannya, rekod tidak boleh daripada jenis yang dimeterai kerana ia sudah pun daripada jenis terakhir dan tidak boleh dilanjutkan oleh mana-mana kelas lain. Tetapi apa yang anda boleh lakukan ialah mengisytiharkan rekod seperti yang dibenarkan dalam antara muka jenis tertutup (pertimbangkan bahawa rekod tidak boleh melanjutkan kelas, hanya melaksanakan antara muka). Sebagai contoh, jika anda mempunyai rekod yang dipanggil Rectangle dan antara muka Bentuk jenis dimeterai, anda boleh mengisytiharkan Rectangle seperti yang dibenarkan dalam antara muka Shape dan dengan cara ini Rectangle akan dapat melaksanakan antara muka Shape dan semua kaedah yang mengandungi antara muka ini.
public class Shape { // ... } public class Circle extends Shape { // ... }
Bagaimana dengan kelas dalaman?
Jika kelas yang diisytiharkan sebagai dimeterai mempunyai kelas dalam (kelas bersarang atau dalam), diandaikan bahawa kelas ini tergolong dalam kelas utama dan, oleh itu, tidak perlu mengisytiharkannya sebagai dibenarkan. Sebagai contoh, jika anda mempunyai kelas Haiwan yang diisytiharkan sebagai dimeterai dan pada masa yang sama ia mempunyai Dog dan Cat sebagai kelas dalaman, kelas ini tidak perlu diisytiharkan sebagai dibenarkan, tetapi mereka mesti melanjutkan kelas utama dan daripada jenis terakhir , dimeterai atau tidak dimeterai .
public final class Shape { // ... } public class Circle extends Shape { // Error // ... }
Kesimpulan
Kelas tertutup ialah satu cara untuk mengehadkan hierarki kelas kepada bilangan terhingga subkelas yang dibenarkan, walaupun kita telah melihat bahawa jika kelas diisytiharkan tidak dimeterai tujuannya agak hilang atau Dengan mengisytiharkan subkelas sebagai dimeterai anda boleh melanjutkan hierarki ini lebih jauh lagi.
Adalah penting untuk mempertimbangkan bahawa apabila mengisytiharkan kelas sebagai dimeterai ini hanya merujuk kepada siapa yang boleh melanjutkannya, tetapi tidak mengehadkan penciptaan contoh kelas utama, dan ia juga tidak mengubah suai semantik kelas, iaitu, ia tidak mengubah suai gelagat dalaman kelas.
Atas ialah kandungan terperinci Kelas Tertutup en Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

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

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

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

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

Perbezaan antara hashmap dan hashtable terutamanya dicerminkan dalam keselamatan benang, sokongan nilai null dan prestasi. 1. Dari segi keselamatan benang, hashtable adalah benang selamat, dan kaedahnya kebanyakannya kaedah segerak, sementara hashmap tidak melakukan pemprosesan penyegerakan, yang bukan benang-selamat; 2. Dari segi sokongan nilai null, hashmap membolehkan satu kunci null dan nilai null berbilang, manakala hashtable tidak membenarkan kekunci atau nilai null, jika tidak, nullPointerException akan dibuang; 3. Dari segi prestasi, hashmap lebih cekap kerana tidak ada mekanisme penyegerakan, dan Hashtable mempunyai prestasi penguncian yang rendah untuk setiap operasi. Adalah disyorkan untuk menggunakan ConcurrentHashMap sebaliknya.

Java menggunakan kelas pembalut kerana jenis data asas tidak dapat mengambil bahagian secara langsung dalam operasi berorientasikan objek, dan bentuk objek sering diperlukan dalam keperluan sebenar; 1. Kelas koleksi hanya boleh menyimpan objek, seperti senarai menggunakan tinju automatik untuk menyimpan nilai berangka; 2. Generik tidak menyokong jenis asas, dan kelas pembungkusan mesti digunakan sebagai parameter jenis; 3. Kelas pembungkusan boleh mewakili nilai null untuk membezakan data yang tidak tersendiri atau hilang; 4. Kelas pembungkusan menyediakan kaedah praktikal seperti penukaran rentetan untuk memudahkan parsing dan pemprosesan data, jadi dalam senario di mana ciri -ciri ini diperlukan, kelas pembungkusan sangat diperlukan.

Staticmethodsininterfaceswereintroducedinjava8toallowutilityfunctionswithintheintheinterfaceitself.beforjava8, SuchfunctionsRequiredseparateHelpereHelperes, LeadingTodisorgaganizedCode.Now, staticmethodethreeKeybeeMeKeBeReSes, staticmethodeDethreeKeybeeMeKeBeReSes, staticmethodethreeKeybeeMeKeKeBeReSes, staticmethodeDethreeKeybeeMeKeKeBeReKeNey

Penyusun JIT mengoptimumkan kod melalui empat kaedah: kaedah dalam talian, pengesanan tempat panas dan penyusunan, spekulasi jenis dan devirtualisasi, dan penghapusan operasi yang berlebihan. 1. Kaedah sebaris mengurangkan panggilan overhead dan memasukkan kaedah kecil yang sering dipanggil terus ke dalam panggilan; 2. Pengesanan tempat panas dan pelaksanaan kod frekuensi tinggi dan mengoptimumkannya untuk menjimatkan sumber; 3. Jenis spekulasi mengumpul maklumat jenis runtime untuk mencapai panggilan devirtualisasi, meningkatkan kecekapan; 4. Operasi berlebihan menghapuskan pengiraan dan pemeriksaan yang tidak berguna berdasarkan penghapusan data operasi, meningkatkan prestasi.

Blok permulaan contoh digunakan dalam Java untuk menjalankan logik inisialisasi apabila membuat objek, yang dilaksanakan sebelum pembina. Ia sesuai untuk senario di mana beberapa pembina berkongsi kod inisialisasi, permulaan medan kompleks, atau senario permulaan kelas tanpa nama. Tidak seperti blok inisialisasi statik, ia dilaksanakan setiap kali ia ditegaskan, manakala blok permulaan statik hanya dijalankan sekali apabila kelas dimuatkan.

Injava, thefinalkeywordpreventsavariable'svaluefrombeingchangedafterassignment, butitsbehaviordiffersforprimitivesandobjectreferences.forprimitiveVariables, finalmakesthevalueconstant, asinfinalintmax_speed = 100;

Mod kilang digunakan untuk merangkum logik penciptaan objek, menjadikan kod lebih fleksibel, mudah dikekalkan, dan ditambah longgar. Jawapan teras adalah: dengan mengurus logik penciptaan objek secara berpusat, menyembunyikan butiran pelaksanaan, dan menyokong penciptaan pelbagai objek yang berkaitan. Keterangan khusus adalah seperti berikut: Mod Kilang menyerahkan penciptaan objek ke kelas kilang khas atau kaedah untuk diproses, mengelakkan penggunaan Newclass () secara langsung; Ia sesuai untuk senario di mana pelbagai jenis objek yang berkaitan dicipta, logik penciptaan boleh berubah, dan butiran pelaksanaan perlu disembunyikan; Sebagai contoh, dalam pemproses pembayaran, jalur, paypal dan contoh lain dicipta melalui kilang -kilang; Pelaksanaannya termasuk objek yang dikembalikan oleh kelas kilang berdasarkan parameter input, dan semua objek menyedari antara muka yang sama; Varian biasa termasuk kilang -kilang mudah, kaedah kilang dan kilang abstrak, yang sesuai untuk kerumitan yang berbeza.

Terdapat dua jenis penukaran: tersirat dan eksplisit. 1. Penukaran tersirat berlaku secara automatik, seperti menukar int untuk berganda; 2. Penukaran eksplisit memerlukan operasi manual, seperti menggunakan (int) mydouble. Kes di mana penukaran jenis diperlukan termasuk memproses input pengguna, operasi matematik, atau lulus pelbagai jenis nilai antara fungsi. Isu-isu yang perlu diperhatikan adalah: Mengubah nombor terapung ke dalam bilangan bulat akan memotong bahagian pecahan, mengubah jenis besar menjadi jenis kecil boleh menyebabkan kehilangan data, dan beberapa bahasa tidak membenarkan penukaran langsung jenis tertentu. Pemahaman yang betul tentang peraturan penukaran bahasa membantu mengelakkan kesilapan.
