Apa perbedaan utama antara kelas dalam dan kelas bersarang statis di Jawa? Apakah desain / implementasi berperan dalam memilih salah satunya?
java
inner-classes
static-classes
Mahakuasa
sumber
sumber
item 22 : Favor static member classes over non static
Jawaban:
Dari Tutorial Java :
Kelas bersarang statis diakses menggunakan nama kelas terlampir:
Misalnya, untuk membuat objek untuk kelas bersarang statis, gunakan sintaks ini:
Objek yang merupakan instance dari kelas dalam ada di dalam instance dari kelas luar. Pertimbangkan kelas-kelas berikut:
Sebuah instance dari InnerClass hanya dapat ada dalam instance dari OuterClass dan memiliki akses langsung ke metode dan bidang instance yang melampirkan.
Untuk membuat instance kelas dalam, Anda harus terlebih dahulu membuat kelas luar. Lalu, buat objek dalam di dalam objek luar dengan sintaks ini:
lihat: Tutorial Java - Kelas Bersarang
Untuk catatan kelengkapan bahwa ada juga yang namanya kelas dalam tanpa instance turunan :
Di sini,
new A() { ... }
adalah kelas dalam yang didefinisikan dalam konteks statis dan tidak memiliki instance terlampir.sumber
import OuterClass.StaticNestedClass;
kemudian referensi kelas hanya sebagai OuterClass.OuterClass.InnerClass innerObject = outerObject.new InnerClass();
?The tutorial Java mengatakan :
Dalam bahasa umum, istilah "bersarang" dan "dalam" digunakan secara bergantian oleh sebagian besar programmer, tetapi saya akan menggunakan istilah yang benar "kelas bersarang" yang mencakup bagian dalam dan statis.
Kelas dapat bersarang ad infinitum , misalnya kelas A dapat berisi kelas B yang berisi kelas C yang berisi kelas D, dll. Namun, lebih dari satu tingkat kelas bersarang jarang terjadi, karena umumnya desain yang buruk.
Ada tiga alasan Anda dapat membuat kelas bersarang:
Ada empat jenis kelas bersarang di Jawa . Secara singkat, mereka adalah:
Biarkan saya menguraikan lebih detail.
Kelas Statis
Kelas statis adalah jenis yang paling mudah untuk dipahami karena tidak ada hubungannya dengan instance dari kelas yang berisi.
Kelas statis adalah kelas yang dinyatakan sebagai anggota statis kelas lain. Sama seperti anggota statis lainnya, kelas semacam itu benar-benar hanya gantungan yang menggunakan kelas yang mengandung sebagai namespace-nya, misalnya kelas Goat yang dinyatakan sebagai anggota statis kelas Badak dalam paket pizza dikenal dengan nama pizza.Rhino.Goat .
Terus terang, kelas statis adalah fitur yang sangat tidak berharga karena kelas sudah dibagi menjadi ruang nama berdasarkan paket. Satu-satunya alasan nyata untuk membuat kelas statis adalah kelas semacam itu memiliki akses ke anggota statis privat kelasnya, tetapi saya menemukan ini sebagai pembenaran yang cukup lemah untuk fitur kelas statis ada.
Kelas Batin
Kelas dalam adalah kelas yang dinyatakan sebagai anggota non-statis dari kelas lain:
Seperti halnya dengan kelas statis, kelas dalam dikenal sebagai terkualifikasi dengan nama kelasnya yang mengandung, pizza.Rhino.Goat , tetapi di dalam kelas yang mengandung, itu dapat diketahui dengan nama yang sederhana. Namun, setiap instance dari kelas batin terkait dengan instance tertentu dari kelas yang mengandungnya: di atas, Kambing yang diciptakan dalam jeriken , secara implisit terkait dengan instance Badak ini dalam jeriken . Jika tidak, kami membuat instance Badak terkait menjadi eksplisit saat kami membuat Instansi kambing :
(Perhatikan bahwa Anda menyebut tipe dalam hanya sebagai Kambing dalam sintaks baru yang aneh : Java menyimpulkan tipe yang mengandung dari bagian badak . Dan, ya badak baru. Goat () juga akan lebih masuk akal bagi saya.)
Jadi apa manfaatnya bagi kita? Yah, instance kelas dalam memiliki akses ke anggota instance dari instance kelas yang berisi. Anggota instance terlampir ini dirujuk ke dalam kelas batin hanya melalui nama sederhana mereka, bukan melalui ini ( ini dalam kelas batin merujuk ke instance kelas dalam, bukan instance kelas berisi yang terkait):
Di kelas dalam, Anda bisa merujuk ini dari kelas yang mengandung sebagai Rhino.this , dan Anda dapat menggunakan ini untuk merujuk kepada anggotanya, misalnya Rhino.this.barry .
Kelas Dalam Lokal
Kelas dalam lokal adalah kelas yang dideklarasikan di tubuh metode. Kelas semacam itu hanya diketahui dalam metode mengandungnya, sehingga hanya dapat dipakai dan memiliki anggota yang diakses dalam metode mengandungnya. Keuntungannya adalah bahwa instance kelas dalam lokal terikat dan dapat mengakses variabel lokal akhir dari metode yang mengandung. Ketika instance menggunakan lokal final dari metode yang mengandung, variabel mempertahankan nilai yang dipegangnya pada saat pembuatan instance, bahkan jika variabel telah keluar dari ruang lingkup (ini adalah secara efektif Java mentah, versi penutupan terbatas).
Karena kelas dalam lokal bukan anggota kelas atau paket, itu tidak dinyatakan dengan tingkat akses. (Namun, jelaskan bahwa anggotanya sendiri memiliki tingkat akses seperti di kelas normal.)
Jika kelas dalam lokal dideklarasikan dalam metode instance, instantiasi kelas batin terkait dengan instance yang dipegang oleh metode yang mengandung ini pada saat pembuatan instance, dan sehingga anggota instance kelas yang mengandung dapat diakses seperti dalam sebuah instance kelas batin. Kelas dalam lokal adalah instantiated hanya melalui namanya, misalnya kelas dalam lokal Cat dipakai sebagai Cat baru () , bukan yang baru ini. Kucing () seperti yang Anda harapkan.
Kelas Batin Anonim
Kelas batin anonim adalah cara yang mudah digunakan secara sintaksis untuk menulis kelas batin setempat. Paling umum, kelas dalam lokal dipakai paling banyak hanya sekali setiap kali metode yang mengandung dijalankan. Maka akan lebih baik, jika kita bisa menggabungkan definisi kelas dalam lokal dan instantiasinya tunggal ke dalam satu bentuk sintaksis yang nyaman, dan juga akan menyenangkan jika kita tidak harus memikirkan nama untuk kelas (semakin sedikit tidak membantu beri nama kode Anda, semakin baik). Kelas dalam anonim memungkinkan kedua hal ini:
Ini adalah ekspresi yang mengembalikan instance baru dari kelas tanpa nama yang memperluas ParentClassName . Anda tidak dapat memasok konstruktor Anda sendiri; sebaliknya, satu disediakan secara implisit yang hanya memanggil konstruktor super, sehingga argumen yang diberikan harus sesuai dengan konstruktor super. (Jika induk berisi beberapa konstruktor, yang "paling sederhana" disebut, "paling sederhana" sebagaimana ditentukan oleh seperangkat aturan yang agak rumit yang tidak layak untuk dipelajari secara terperinci - cukup perhatikan apa yang dikatakan NetBeans atau Eclipse kepada Anda.)
Atau, Anda dapat menentukan antarmuka yang akan diterapkan:
Deklarasi semacam itu menciptakan instance baru dari kelas tanpa nama yang memperluas Object dan mengimplementasikan InterfaceName . Sekali lagi, Anda tidak dapat memasok konstruktor Anda sendiri; dalam kasus ini, Java secara implisit memasok konstruktor no-arg, do-nothing (sehingga tidak akan pernah ada argumen konstruktor dalam kasus ini).
Meskipun Anda tidak bisa memberikan konstruktor kelas dalam anonim, Anda masih bisa melakukan pengaturan apa pun yang Anda inginkan menggunakan blok penginisialisasi (blok {} ditempatkan di luar metode apa pun).
Jelaskan bahwa kelas batin anonim hanyalah cara yang kurang fleksibel untuk menciptakan kelas batin lokal dengan satu instance. Jika Anda menginginkan kelas dalam lokal yang mengimplementasikan beberapa antarmuka atau yang mengimplementasikan antarmuka sambil memperluas beberapa kelas selain Objek atau yang menentukan konstruktornya sendiri, Anda terjebak membuat kelas dalam lokal bernama biasa.
sumber
Saya tidak berpikir perbedaan nyata menjadi jelas dalam jawaban di atas.
Pertama untuk mendapatkan ketentuan yang benar:
Sejauh ini jawaban Martin benar. Namun, pertanyaan sebenarnya adalah: Apa tujuan dari menyatakan kelas bersarang statis atau tidak?
Anda menggunakan kelas bersarang statis jika Anda hanya ingin menjaga kelas Anda bersama-sama jika mereka termasuk bersama secara topikal atau jika kelas bersarang secara eksklusif digunakan dalam kelas terlampir. Tidak ada perbedaan semantik antara kelas bersarang statis dan setiap kelas lainnya.
Kelas bersarang non-statis adalah binatang yang berbeda. Mirip dengan kelas dalam anonim, kelas bersarang tersebut sebenarnya adalah penutupan. Itu berarti mereka menangkap ruang lingkup di sekitarnya dan contoh terlampir mereka dan membuatnya dapat diakses. Mungkin sebuah contoh akan menjelaskan hal itu. Lihat rintisan Kontainer ini:
Dalam hal ini Anda ingin memiliki referensi dari item anak ke wadah induk. Menggunakan kelas bersarang non-statis, ini berfungsi tanpa beberapa pekerjaan. Anda dapat mengakses instance terlampir dari Container dengan sintaks
Container.this
.Penjelasan lebih hardcore berikut:
Jika Anda melihat bytecodes Java kompiler menghasilkan untuk kelas bersarang (non-statis) itu mungkin menjadi lebih jelas:
Seperti yang Anda lihat, kompiler membuat bidang tersembunyi
Container this$0
. Ini diatur dalam konstruktor yang memiliki parameter tambahan tipe Kontainer untuk menentukan contoh terlampir. Anda tidak dapat melihat parameter ini di sumber tetapi kompiler secara implisit menghasilkannya untuk kelas bersarang.Contoh Martin
akan dikompilasi ke panggilan sesuatu seperti (dalam bytecodes)
Demi kelengkapan:
Kelas anonim adalah contoh sempurna dari kelas bertingkat non-statis yang tidak memiliki nama yang terkait dengannya dan tidak dapat direferensikan nanti.
sumber
Saya pikir tidak ada jawaban di atas yang menjelaskan kepada Anda perbedaan nyata antara kelas bersarang dan kelas bertingkat statis dalam hal desain aplikasi:
Gambaran
Kelas bersarang bisa menjadi tidak statis atau statis dan dalam setiap kasus adalah kelas yang didefinisikan dalam kelas lain . Kelas bersarang harus ada hanya untuk melayani adalah kelas melampirkan , jika kelas bersarang berguna oleh kelas lain (tidak hanya melampirkan), harus dinyatakan sebagai kelas tingkat atas.
Perbedaan
Kelas bertingkat Nonstatik : secara implisit dikaitkan dengan instance terlampir dari kelas yang mengandung, ini berarti bahwa dimungkinkan untuk memanggil metode dan variabel akses dari instance melampirkan. Salah satu penggunaan umum dari kelas bertingkat nonstatik adalah untuk mendefinisikan kelas Adaptor.
Static Nested Class : tidak dapat mengakses instance kelas tertutup dan memanggil metode di atasnya, jadi harus digunakan ketika kelas bertingkat tidak memerlukan akses ke instance instance dari kelas penutup. Penggunaan umum dari kelas bersarang statis adalah untuk mengimplementasikan komponen objek luar.
Kesimpulan
Jadi perbedaan utama antara keduanya dari sudut pandang desain adalah: kelas bersarang nonstatis dapat mengakses instance dari kelas kontainer, sedangkan statis tidak bisa .
sumber
Secara sederhana kita membutuhkan kelas bersarang terutama karena Java tidak menyediakan penutupan.
Kelas Bertingkat adalah kelas yang didefinisikan di dalam tubuh kelas penutup lain. Mereka terdiri dari dua jenis - statis dan non-statis.
Mereka diperlakukan sebagai anggota kelas terlampir, maka Anda dapat menentukan salah satu dari empat penentu akses -
private, package, protected, public
. Kami tidak memiliki kemewahan ini dengan kelas tingkat atas, yang hanya dapat dideklarasikanpublic
atau paket-pribadi.Kelas dalam alias Kelas non-stack memiliki akses ke anggota lain dari kelas atas, bahkan jika mereka dinyatakan pribadi sedangkan kelas bersarang statis tidak memiliki akses ke anggota lain dari kelas atas.
Inner1
adalah kelas batin kita yang statis danInner2
kelas batin kita yang tidak statis. Perbedaan utama di antara mereka, Anda tidak dapat membuatInner2
instance tanpa Outer di mana Anda dapat membuatInner1
objek secara mandiri.Kapan Anda akan menggunakan kelas dalam?
Pikirkan situasi di mana
Class A
danClass B
terkait,Class B
perlu mengaksesClass A
anggota, danClass B
hanya terkait denganClass A
. Kelas-kelas batin muncul dalam gambar.Untuk membuat instance dari kelas dalam, Anda perlu membuat instance dari kelas luar Anda.
atau
Kapan Anda akan menggunakan kelas dalam statis?
Anda akan mendefinisikan kelas dalam statis ketika Anda tahu bahwa itu tidak memiliki hubungan dengan turunan kelas atas / kelas atas. Jika kelas dalam Anda tidak menggunakan metode atau bidang dari kelas luar, itu hanya buang-buang ruang, jadi buatlah itu statis.
Misalnya, untuk membuat objek untuk kelas bersarang statis, gunakan sintaks ini:
Keuntungan dari kelas bersarang statis adalah bahwa ia tidak memerlukan objek dari kelas yang mengandung / kelas atas untuk bekerja. Ini dapat membantu Anda mengurangi jumlah objek yang dibuat aplikasi saat runtime.
sumber
OuterClass.Inner2 inner = outer.new Inner2();
?static inner
adalah kontradiksi dalam hal.Berikut adalah perbedaan dan persamaan utama antara kelas dalam Java dan kelas bersarang statis.
Semoga ini bisa membantu!
Kelas batin
Terkait dengan instance dari menyertakan kelas sehingga untuk instantiate itu pertama membutuhkan instance dari kelas luar (perhatikan tempat kata kunci baru ):
Tidak dapat menentukan anggota statis itu sendiri
Kelas bersarang statis
Tidak dapat mengakses luar kelas misalnya metode atau bidang
Tidak terkait dengan instance dari menyertakan kelas Jadi untuk instantiate itu:
Kesamaan
Mengapa Menggunakan Kelas Bertingkat?
Menurut dokumentasi Oracle ada beberapa alasan ( dokumentasi lengkap ):
sumber
Saya pikir, konvensi yang diikuti umumnya adalah ini:
Namun, beberapa poin lain yang perlu diingat adalah:
Kelas tingkat atas dan kelas bersarang statis secara semantik sama kecuali jika dalam kasus kelas bersarang statis dapat membuat referensi statis ke bidang / metode statis privat dari kelas [induk] luarnya dan sebaliknya.
Kelas dalam memiliki akses ke variabel instance dari instance terlampir dari kelas [induk] Luar. Namun, tidak semua kelas dalam memiliki instance yang terlampir, misalnya kelas dalam dalam konteks statis, seperti kelas anonim yang digunakan dalam blok penginisialisasi statis, tidak.
Kelas anonim secara default memperluas kelas induk atau mengimplementasikan antarmuka induk dan tidak ada klausa lebih lanjut untuk memperluas kelas lain atau mengimplementasikan antarmuka lagi. Begitu,
new YourClass(){};
caraclass [Anonymous] extends YourClass {}
new YourInterface(){};
caraclass [Anonymous] implements YourInterface {}
Saya merasa bahwa pertanyaan yang lebih besar yang tetap terbuka mana yang digunakan dan kapan? Yah itu sebagian besar tergantung pada skenario apa yang Anda hadapi tetapi membaca jawaban yang diberikan oleh @jrudolph dapat membantu Anda membuat beberapa keputusan.
sumber
Nested class: kelas di dalam kelas
Jenis:
Perbedaan:
Kelas bersarang non-statis [Kelas dalam]
Dalam objek kelas bersarang non-statis kelas dalam ada di dalam objek kelas luar. Sehingga data anggota kelas luar dapat diakses oleh kelas dalam. Jadi untuk membuat objek kelas dalam, kita harus membuat objek kelas luar terlebih dahulu.
Kelas bersarang statis
Dalam objek kelas bersarang statis dari kelas dalam tidak perlu objek dari kelas luar, karena kata "statis" menunjukkan tidak perlu membuat objek.
Jika Anda ingin mengakses x, maka tulis metode di dalam berikut ini
sumber
Instance dari kelas dalam dibuat ketika instance dari kelas luar dibuat. Oleh karena itu anggota dan metode kelas dalam memiliki akses ke anggota dan metode instance (objek) dari kelas luar. Ketika instance dari kelas luar keluar dari ruang lingkup, juga instance kelas dalam tidak ada lagi.
Kelas bersarang statis tidak memiliki contoh konkret. Itu hanya dimuat ketika digunakan untuk pertama kalinya (seperti metode statis). Ini adalah entitas yang sepenuhnya independen, yang metode dan variabelnya tidak memiliki akses ke instance kelas luar.
Kelas bersarang statis tidak digabungkan dengan objek luar, mereka lebih cepat, dan mereka tidak mengambil memori tumpukan / tumpukan, karena itu tidak perlu untuk membuat instance dari kelas tersebut. Oleh karena itu aturan praktisnya adalah mencoba mendefinisikan kelas bersarang statis, dengan ruang lingkup sebatas mungkin (pribadi> = kelas> = dilindungi> = publik), dan kemudian mengonversinya ke kelas dalam (dengan menghapus pengenal "statis") dan melonggarkan ruang lingkup, jika itu benar-benar diperlukan.
sumber
Ada kehalusan tentang penggunaan kelas statis bersarang yang mungkin berguna dalam situasi tertentu.
Sedangkan atribut statis di-instantiated sebelum kelas di-instantiated melalui konstruktornya, atribut-atribut statis di dalam kelas-kelas statis bersarang tampaknya tidak akan di-instantiate sampai setelah konstruktor kelas dipanggil, atau setidaknya tidak sampai setelah atribut direferensikan pertama kali, bahkan jika mereka ditandai sebagai 'final'.
Pertimbangkan contoh ini:
Meskipun 'nested' dan 'innerItem' keduanya dinyatakan sebagai 'final statis'. pengaturan nested.innerItem tidak terjadi sampai setelah kelas instantiated (atau setidaknya tidak sampai setelah item statis bersarang direferensikan pertama kali), karena Anda dapat melihat sendiri dengan mengomentari dan menghapus komentar pada baris yang saya rujuk, atas. Hal yang sama tidak berlaku untuk 'outerItem'.
Setidaknya ini yang saya lihat di Java 6.0.
sumber
Istilah ini digunakan secara bergantian. Jika Anda ingin benar-benar bertele-tele tentang hal itu, maka Anda dapat mendefinisikan "kelas bersarang" untuk merujuk ke kelas dalam statis, yang tidak memiliki instance penutup. Dalam kode, Anda mungkin memiliki sesuatu seperti ini:
Itu bukan definisi yang diterima secara luas.
sumber
Dalam hal membuat instance, instance kelas dalam non-statis dibuat dengan referensi objek kelas luar di mana ia didefinisikan. Ini berarti ada inclosing instance. Tetapi instance dari kelas dalam statis dibuat dengan referensi dari kelas luar, bukan dengan referensi objek dari kelas luar. Ini berarti tidak menyertakan instance.
Sebagai contoh:
sumber
Saya tidak berpikir ada banyak untuk ditambahkan di sini, sebagian besar jawaban dengan sempurna menjelaskan perbedaan antara kelas bersarang statis dan kelas dalam. Namun, pertimbangkan masalah berikut saat menggunakan kelas bersarang vs kelas dalam. Seperti disebutkan dalam beberapa jawaban kelas batin tidak dapat dipakai tanpa dan contoh melampirkan kelas mereka yang berarti bahwa mereka TAHAN sebuah pointer ke instance dari kelas melampirkan mereka yang dapat menyebabkan meluap memori atau stack overflow pengecualian karena fakta GC tidak akan dapat mengumpulkan sampah kelas melampirkan bahkan jika mereka tidak digunakan lagi. Untuk membuatnya lebih jelas, periksa kode berikut:
Jika Anda menghapus komentar pada
// inner = null;
Program ini akan mengeluarkan " Aku hancur! ", Tetapi menjaga komentar ini tidak akan.Alasannya adalah bahwa instance dalam putih masih dirujuk GC tidak dapat mengumpulkannya dan karena itu merujuk (memiliki pointer ke) instance luar itu tidak dikumpulkan juga. Memiliki cukup benda-benda ini di proyek Anda dan dapat kehabisan memori.
Dibandingkan dengan kelas dalam statis yang tidak memiliki titik untuk instance kelas dalam karena tidak terkait instance tetapi terkait kelas. Program di atas dapat mencetak " Saya hancur! " Jika Anda membuat kelas dalam statis dan dipakai
Outer.Inner i = new Outer.Inner();
sumber
Kelas bertingkat adalah istilah yang sangat umum: setiap kelas yang bukan level atas adalah kelas bertingkat. Kelas dalam adalah kelas bersarang non-statis. Joseph Darcy menulis penjelasan yang sangat bagus tentang Nested, Inner, Member, dan Kelas Tingkat Atas .
sumber
Ummm ... kelas dalam adalah kelas bersarang ... maksud Anda kelas anonim dan kelas dalam?
Sunting: Jika Anda benar-benar bermaksud bagian dalam vs anonim ... kelas dalam hanyalah kelas yang didefinisikan dalam kelas seperti:
Sedangkan kelas anonim adalah ekstensi dari kelas yang didefinisikan secara anonim, jadi tidak ada kelas "sebenarnya yang didefinisikan, seperti pada:
Edit Lebih Lanjut:
Wikipedia mengklaim ada perbedaan di Jawa, tapi saya sudah bekerja dengan Java selama 8 tahun, dan ini adalah yang pertama saya mendengar perbedaan ... belum lagi tidak ada referensi di sana untuk mendukung klaim ... bawah baris, kelas dalam adalah kelas yang didefinisikan dalam kelas (statis atau tidak), dan bersarang hanyalah istilah lain yang berarti hal yang sama.
Ada perbedaan halus antara kelas bertingkat statis dan non-statis ... pada dasarnya kelas dalam non-statis memiliki akses implisit ke bidang contoh dan metode kelas penutup (sehingga mereka tidak dapat dibangun dalam konteks statis, itu akan menjadi kompiler kesalahan). Kelas bersarang statis, di sisi lain, tidak memiliki akses implisit ke bidang contoh dan metode, dan BISA dibangun dalam konteks statis.
sumber
Pelajar penargetan, yang pemula untuk Java dan / atau Kelas Bertingkat
Kelas bersarang dapat berupa:
1. Kelas bersarang statis.
2. Kelas Bersarang Non Statis. (juga dikenal sebagai kelas dalam ) => Harap ingat ini
1.Inner class
Contoh:
Kelas dalam adalah himpunan bagian dari kelas bersarang:
Keistimewaan kelas dalam:
2. Kelas Bersarang Statis:
Contoh:
Kasus 1: Membuat instance kelas bersarang statis dari kelas yang tidak tertutup
Kasus 2: Membuat instance kelas bersarang statis dari kelas tertutup
Keistimewaan kelas Statis:
Kesimpulan:
Pertanyaan: Apa perbedaan utama antara kelas dalam dan kelas bersarang statis di Jawa?
Jawaban: cukup telusuri setiap kelas yang disebutkan di atas.
sumber
Kelas dalam dan kelas statis bersarang di Jawa keduanya adalah kelas yang dideklarasikan di dalam kelas lain, yang dikenal sebagai kelas tingkat atas di Jawa. Dalam terminologi Java, Jika Anda mendeklarasikan static class bersarang, itu akan disebut kelas statis bersarang di Jawa sementara kelas bersarang non statis secara sederhana disebut sebagai Inner Class.
Apa itu Inner Class di Jawa?
Setiap kelas yang bukan tingkat atas atau dideklarasikan di dalam kelas lain dikenal sebagai kelas bersarang dan keluar dari kelas bersarang, kelas yang dinyatakan non statis dikenal sebagai kelas dalam di Jawa. ada tiga jenis kelas dalam di Jawa:
1) Kelas dalam lokal - dideklarasikan di dalam blok kode atau metode.
2) Anonim kelas batin - adalah kelas yang tidak memiliki nama untuk referensi dan diinisialisasi di tempat yang sama di mana ia dibuat.
3) Anggota kelas dalam - dinyatakan sebagai anggota non-statis dari kelas luar.
Apa kelas statis bersarang di Jawa?
Kelas statis bersarang adalah kelas lain yang dideklarasikan di dalam kelas sebagai anggota dan dibuat statis. Kelas statis bersarang juga dinyatakan sebagai anggota kelas luar dan dapat dibuat pribadi, publik atau dilindungi seperti anggota lainnya. Salah satu manfaat utama dari kelas statis bersarang atas kelas dalam adalah bahwa instance dari kelas statis bersarang tidak melekat pada instance apa pun dari kelas luar. Anda juga tidak memerlukan turunan dari kelas luar untuk membuat turunan dari kelas statis bersarang di Jawa .
1) Dapat mengakses anggota data statis kelas luar termasuk pribadi.
2) Kelas bersarang statis tidak dapat mengakses anggota atau metode data non-statis .
Ref: Kelas dalam dan Kelas Statis bersarang di Jawa dengan Contoh
sumber
Saya pikir orang-orang di sini harus memperhatikan Poster bahwa: Kelas Sarang Statis hanya kelas batin pertama. Sebagai contoh:
Jadi, ringkasnya, kelas statis tidak tergantung kelas mana yang berisi. Jadi, mereka tidak bisa di kelas normal. (karena kelas normal membutuhkan instance).
sumber
Ketika kami mendeklarasikan kelas anggota statis di dalam kelas, itu dikenal sebagai kelas bertingkat tingkat atas atau kelas bertumpuk statis. Itu bisa ditunjukkan seperti di bawah ini:
Ketika kita mendeklarasikan kelas anggota non-statis di dalam kelas itu dikenal sebagai kelas dalam. Kelas batin dapat ditunjukkan sebagai berikut:
sumber
Berikut ini adalah contoh dari
static nested class
daninner class
:OuterClass.java
OuterClassTest:
sumber
Saya pikir tidak ada jawaban di atas yang memberikan contoh nyata kepada Anda perbedaan antara kelas bersarang dan kelas bersarang statis dalam hal desain aplikasi. Dan perbedaan utama antara kelas bersarang statis dan kelas dalam adalah kemampuan untuk mengakses bidang instance kelas luar.
Mari kita lihat dua contoh berikut.
Kelas sarang statis: Contoh yang baik menggunakan kelas bersarang statis adalah pola pembangun ( https://dzone.com/articles/design-patterns-the-builder-pattern ).
Untuk BankAccount kami menggunakan kelas bersarang statis, terutama karena
Contoh kelas statis statis dapat dibuat sebelum kelas luar.
Dalam pola builder, builder adalah kelas pembantu yang digunakan untuk membuat BankAccount.
Kelas dalam: Penggunaan kelas dalam yang umum adalah untuk mendefinisikan pengendali event. https://docs.oracle.com/javase/tutorial/uiswing/events/generalrules.html
Untuk MyClass, kami menggunakan kelas dalam, terutama karena:
Kelas dalam MyAdapter perlu mengakses anggota kelas luar.
Dalam contoh ini, MyAdapter hanya dikaitkan dengan MyClass. Tidak ada kelas lain yang terkait dengan MyAdapter. jadi lebih baik mengaturnya bersama tanpa menggunakan konvensi nama
sumber
Diagram
Perbedaan utama antara
static nested
dannon-static nested
kelas adalah bahwastatic nested
tidak memiliki akses ke anggota kelas luar non-statissumber
Pertama-tama Tidak ada kelas yang disebut kelas Static. Pengubah statis digunakan dengan kelas dalam (disebut sebagai Nested Class) mengatakan bahwa itu adalah anggota statis dari Kelas Luar yang berarti kita dapat mengaksesnya seperti dengan anggota statis lainnya dan tanpa memiliki turunan dari kelas luar. (Yang awalnya merupakan manfaat statis.)
Perbedaan antara menggunakan kelas Nested dan kelas dalam reguler adalah:
Pertama kita bisa instantiate Outerclass lalu kita bisa mengakses Inner.
Tetapi jika Class bersarang maka sintaksnya adalah:
Yang menggunakan Sintaks statis sebagai implementasi normal dari kata kunci statis.
sumber
Bahasa pemrograman Java memungkinkan Anda untuk mendefinisikan kelas dalam kelas lain. Kelas semacam itu disebut kelas bersarang dan diilustrasikan di sini:
Kelas bersarang dibagi menjadi dua kategori: statis dan non-statis. Kelas bersarang yang dideklarasikan statis disebut kelas bersarang statis. Kelas bersarang non-statis disebut kelas dalam. Satu hal yang harus diingat adalah kelas bersarang non-statis (kelas dalam) memiliki akses ke anggota lain dari kelas terlampir, bahkan jika mereka dinyatakan pribadi. Kelas bersarang statis hanya memiliki akses ke anggota lain dari kelas terlampir jika mereka statis. Itu tidak dapat mengakses anggota non-statis dari kelas luar. Seperti halnya metode dan variabel kelas, kelas bersarang statis dikaitkan dengan kelas luarnya. Misalnya, untuk membuat objek untuk kelas bersarang statis, gunakan sintaks ini:
Untuk membuat instance kelas dalam, Anda harus terlebih dahulu membuat kelas luar. Lalu, buat objek dalam di dalam objek luar dengan sintaks ini:
Mengapa kami menggunakan kelas bersarang
Sumber: Tutorial Java ™ - Kelas Bertingkat
sumber
Perbedaannya adalah bahwa deklarasi kelas bersarang yang juga statis dapat dipakai di luar kelas melampirkan.
Ketika Anda memiliki deklarasi kelas bersarang yang tidak statis, juga dikenal sebagai kelas dalam , Java tidak akan membiarkan Anda instantiate kecuali melalui kelas terlampir. Objek yang dibuat dari kelas dalam dihubungkan dengan objek yang dibuat dari kelas luar, sehingga kelas dalam dapat merujuk bidang bidang luar.
Tetapi jika itu statis, maka tautannya tidak ada, bidang luar tidak dapat diakses (kecuali melalui referensi biasa seperti objek lain) dan karena itu Anda dapat membuat instance kelas bersarang dengan sendirinya.
sumber
Cukup sederhana, membandingkan kelas lokal statis dan kelas dalam non-statis
Perbedaan:
Kelas lokal statis: Hanya
dapat mengakses anggota statis dari kelas luar.
Tidak dapat memiliki penginisialisasi statis.
Tidak dapat diakses langsung dari luar fungsi yang dideklarasikan
sumber
Saya telah menggambarkan berbagai kemungkinan skenario benar dan salah yang dapat terjadi dalam kode java.
sumber