Saya memiliki program Java yang terlihat seperti ini.
public class LocalScreen {
public void onMake() {
aFuncCall(LocalScreen.this, oneString, twoString);
}
}
Apa LocalScreen.this
artinya dalam aFuncCall
?
LocalScreen.this
mengacu this
pada kelas penutup.
Contoh ini harus menjelaskannya:
public class LocalScreen {
public void method() {
new Runnable() {
public void run() {
// Prints "An anonymous Runnable"
System.out.println(this.toString());
// Prints "A LocalScreen object"
System.out.println(LocalScreen.this.toString());
// Won't compile! 'this' is a Runnable!
onMake(this);
// Compiles! Refers to enclosing object
onMake(LocalScreen.this);
}
public String toString() {
return "An anonymous Runnable!";
}
}.run();
}
public String toString() { return "A LocalScreen object"; }
public void onMake(LocalScreen ls) { /* ... */ }
public static void main(String[] args) {
new LocalScreen().method();
}
}
Keluaran:
An anonymous Runnable!
A LocalScreen object
Posting ini telah ditulis ulang sebagai artikel di sini .
public class a { private class a { public void run() { System.out.println(a.this.toString()); } }
Saya mengira itu masalah yang sama; yanga.this
dalamrun()
harus mengacu pada melampirkana
'sthis
. Apakah saya benar? (Beginilah cara kode yang diperkecil ada di.jar
file aplikasi OSX Kindle Previewer , saya hanya mencoba memahami apa yang saya lihat.)a.this
dalam contoh Anda tidak ditentukan. Saya tidak tahu apakah batasan ini benar untuk bytecode. Mungkin tidak.Itu berarti
this
turunan dariLocalScreen
kelas luar .Menulis
this
tanpa qualifier akan mengembalikan instance kelas dalam tempat pemanggilan berada.sumber
Kompiler mengambil kode dan melakukan sesuatu seperti ini dengannya:
Seperti yang Anda lihat, ketika kompilator mengambil kelas dalam, ia mengubahnya menjadi kelas luar (ini adalah keputusan desain yang dibuat sejak lama sehingga VM tidak perlu diubah untuk memahami kelas dalam).
Ketika kelas dalam non-statis dibuat, ia membutuhkan referensi ke induk sehingga dapat memanggil metode / variabel akses dari kelas luar.
Bagian dalam kelas dalam ini bukanlah jenis yang tepat, Anda perlu mendapatkan akses ke kelas luar untuk mendapatkan jenis yang tepat untuk memanggil metode onMake.
sumber
new LocalScreen$1().run;
menjadinew LocalScreen$1(this).run;
?Class.this
memungkinkan akses ke instance dari kelas luar. Lihat contoh berikut.Maka Anda akan mendapatkannya.
sumber
Saya tahu apa kebingungan Anda. Saya menemukan masalah sekarang, harus ada adegan khusus untuk membedakannya.
Anda dapat melihat perbedaan antara
THIS.this
danthis
dalam operasi INI baru dengan kode hash (. ##)uji di konsol scala:
THIS.this
selalu menunjuk ke luar kelas INI yang dirujuk oleh val x, tetapithis
berada di luar operasi baru anonim.sumber