Saya memiliki kode berikut:
class Hello {
class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
Saya tahu Thing
tidak melakukan apa-apa, tetapi program Hello, World saya dapat dikompilasi tanpa itu. Hanya kelas saya yang didefinisikan yang gagal pada saya.
Dan itu menolak untuk dikompilasi. Saya mendapatkan No enclosing instance of type Hello is accessible."
pada baris yang menciptakan Hal baru. Saya menebak:
- Saya memiliki masalah tingkat sistem (baik di DrJava atau Java install saya) atau
- Saya memiliki beberapa kesalahpahaman dasar tentang bagaimana membangun program kerja di java.
Ada ide?
java
inner-classes
coolpapa
sumber
sumber
Jawaban:
static class Thing
akan membuat program Anda berfungsi.Seperti itu, Anda punya
Thing
sebagai kelas dalam, yang (menurut definisi) dikaitkan dengan contoh tertentuHello
(bahkan jika itu tidak pernah menggunakan atau merujuk padanya), yang berarti kesalahan untuk mengatakannew Thing();
tanpa memilikiHello
contoh khusus di cakupan.Jika Anda mendeklarasikannya sebagai kelas statis, maka itu adalah kelas "bersarang", yang tidak memerlukan
Hello
instance tertentu .sumber
outer class
,non-static inner class
itu akan dibuat juga bahkan jika saya tidak menggunakannya di mana saja?Anda telah mendeklarasikan kelas
Thing
sebagai kelas dalam yang tidak statis. Itu berarti harus dikaitkan dengan instanceHello
kelas.Dalam kode Anda, Anda mencoba membuat instance dari
Thing
konteks statis. Itulah yang dikeluhkan kompiler.Ada beberapa solusi yang mungkin. Solusi mana yang digunakan tergantung pada apa yang ingin Anda capai.
Pindahkan
Thing
keluar dariHello
kelas.Ubah
Thing
menjadistatic
kelas bersarang.Buat sebuah contoh dari
Hello
sebelum membuat sebuah instance dariThing
.Solusi terakhir ( kelas bersarang non-statis ) akan wajib jika instance
Thing
bergantung pada instanceHello
menjadi bermakna. Misalnya, jika kita punya:setiap upaya mentah untuk membuat objek kelas
Thing
, seperti pada:akan bermasalah, karena tidak akan ada
enormous
nilai yang jelas untuk menguji 31 terhadapnya. Sebuah instanceh
dariHello
kelas luar diperlukan untuk memberikanh.enormous
nilai ini :Karena itu tidak berarti
Thing
jika tidak memilikiHello
.Untuk informasi lebih lanjut tentang kelas bersarang / dalam: Kelas Bertingkat (Tutorial Java)
sumber
Thing thing1 <<HelloInstantiation>>.new Thing()
adalah kuncinya. Saya menghabiskan beberapa menit bingung menggunakan sintaksThing thing1 new <<HelloInstantiation>>.Thing()
. = PYah ... begitu banyak jawaban bagus tetapi saya ingin menambahkan lebih banyak tentang itu. Pandangan singkat tentang kelas dalam di Jawa-Jawa memungkinkan kita untuk mendefinisikan kelas dalam kelas lain dan Mampu kelas sarang dengan cara ini memiliki keuntungan tertentu:
Itu dapat menyembunyikan (Ini meningkatkan enkapsulasi) kelas dari kelas lain - terutama relevan jika kelas hanya digunakan oleh kelas yang terkandung di dalamnya. Dalam hal ini tidak perlu bagi dunia luar untuk mengetahuinya.
Ini dapat membuat kode lebih mudah dikelola karena kelas secara logis dikelompokkan bersama di mana mereka dibutuhkan.
Kelas dalam memiliki akses ke variabel instan dan metode kelas yang mengandungnya.
Kami memiliki tiga jenis
Inner Classes
Beberapa poin penting yang harus diingat
Mari kita coba melihat konsep di atas secara praktis_
Saya harap ini akan membantu semua orang. Silakan merujuk lebih lanjut
sumber
Thing
adalah kelas dalam dengan koneksi otomatis ke instance dariHello
. Anda mendapatkan kesalahan kompilasi karena tidak ada instanceHello
untuk dilampirkan. Anda dapat memperbaikinya dengan paling mudah dengan mengubahnya ke kelas bersarang statis yang tidak memiliki koneksi:sumber
Mari kita memahaminya dengan contoh sederhana berikut ini. Ini terjadi karena ini adalah NASS-STATIC INNER CLASS. Anda harus membutuhkan instance dari kelas luar.
sumber