Saya memiliki potongan kode berikut:
public class MyClass {
class Inner {
int s, e, p;
}
public static void main(String args[]) {
Inner in;
}
}
Sampai bagian ini kodenya baik-baik saja, tetapi saya tidak dapat memberi contoh 'in' dalam metode utama seperti in = new Inner()
yang ditunjukkan non static field cannot be referenced in static context
.
Bagaimana cara saya melakukannya? Saya tidak ingin membuat Inner
kelas saya statis .
java
static
inner-classes
Victor Mukherjee
sumber
sumber
Jawaban:
Anda harus memiliki referensi ke kelas luar lainnya juga.
Jika Inner statis maka itu akan terjadi
sumber
OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass()
. Kelas BersarangKelas dalam "biasa" memiliki penunjuk tersembunyi (implisit) ke instance kelas Luar. Ini memungkinkan kompilator untuk menghasilkan kode untuk mengejar penunjuk untuk Anda tanpa Anda harus mengetiknya. Misalnya, jika ada variabel "a" di kelas luar maka kode di kelas dalam Anda bisa melakukan "a = 0", tetapi kompilator akan menghasilkan kode untuk "outerPointer.a = 0" dengan mempertahankan pointer tersembunyi di bawah selimut.
Ini berarti ketika Anda membuat instance dari kelas dalam, Anda harus memiliki instance kelas luar untuk ditautkan. Jika Anda melakukan pembuatan ini di dalam metode kelas luar maka kompilator tahu untuk menggunakan "ini" sebagai penunjuk implisit. Jika Anda ingin menautkan ke beberapa contoh luar lainnya, maka Anda menggunakan sintaks "baru" khusus (lihat cuplikan kode di bawah).
Jika Anda membuat kelas dalam Anda "statis" maka tidak ada pointer tersembunyi dan kelas dalam Anda tidak dapat mereferensikan anggota kelas luar. Kelas dalam statis identik dengan kelas reguler, tetapi namanya dicakup di dalam induk.
Berikut adalah cuplikan kode yang menunjukkan sintaks untuk membuat kelas dalam statis dan non-statis:
sumber
Jika Anda ingin membuat
new Inner()
dari dalam metode, lakukan dari metode instance kelasMyClass
:sumber
Jawaban Alexei Kaigorodov adalah jawaban yang tepat. Solusinya memungkinkan Anda untuk membuat instance kelas dalam dari dalam metode statis, seperti main () dari kelas yang sama. Jika tidak, Anda tidak dapat membuat instance kelas dalam dalam metode statis. Itu tidak dapat dikompilasi. Solusi Alexei dapat dikompilasi dan memungkinkan Anda untuk membuat instance kelas dalam dari metode statis. Jawaban lain adalah catatan sampingan yang menarik, tetapi saya tidak menganggapnya responsif terhadap pertanyaan yang sebenarnya.
sumber