The this Keyword
DiperkenalkanParameter dapat menyembunyikan medan yang seharusnya diperbarui
- Sebuah objek bernama "Ada". setName(String name) menjalankan name = name; dengan argumen "Bo".
- Kedua nama tanpa kualifikasi merujuk pada parameter, sehingga objek masih memiliki "Ada". this.name = name menetapkan nilai parameter ke medan sebagai gantinya.
"Objek ini"
- Di dalam metode instance,
thismerujuk pada objek yang dipanggil metodenya.student.addScore(10)berjalan denganthis=studenttersebut. this.scoreberarti "scoredari objek yang sedang saya kerjakan." Ini memungkinkan metode berbicara tentang objeknya sendiri secara eksplisit.
Membedakan bidang dan parameter
- Kegunaan utamanya: membedakan variabel instance dari parameter dengan nama yang sama.
void setName(String name) { this.name = name; } this.nameadalah variabel instance;namebiasa adalah parameter. Ini adalah perbaikan standar untuk bug penyembunyian (shadowing) dari 3.8.
Akses ke objek penerima
thismemberikan metode referensi pada objek spesifik yang dipanggilnya. Setiap metode instance memilikithisimplisit, baik Anda menuliskannya atau tidak.- Ketika nama score merujuk pada bidang instance yang tidak di-shadow (diselimuti),
score += s;menggunakanthis.score. Jika parameter atau variabel lokal bernama score menyelimutinya, nama tanpa kualifikasi justru merujuk pada variabel tersebut. Anda hanya menulisthissecara eksplisit jika diperlukan (seperti saat menyelesaikan masalah penyelimutan).
this merujuk pada objek penerima
Di dalam setName, this adalah objek ada yang dipanggil.
Inside an instance method, this refers to...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
this adalah penunjuk pada objek saat ini.
Dalam setName(String name) { this.name = name; }, this.name adalah...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
this.name adalah field; nama biasa adalah parameter.
Kata kunci this dapat digunakan di dalam metode statis.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Metode statis tidak memiliki objek tertentu, sehingga tidak ada this.
Menulis name = name; (tanpa this) di dalam setName(String name) akan melakukan apa?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Kedua nama tersebut adalah parameter; gunakan this.name untuk mengakses field.
Setiap metode instance memiliki this implisit, baik Anda menuliskannya atau tidak.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Sebuah metode instance memiliki penerima saat ini. score tanpa kualifikasi hanya menamai this.score jika tidak ada parameter atau variabel lokal yang menutupi (shadow) field tersebut.
Tidak ada this dalam metode statis
- Metode statis tidak memiliki
this— ia tidak terikat pada objek tertentu. Oleh karena itu, metode statis tidak dapat menggunakanthisatau bidang instance tanpa kualifikasi, namun dapat membaca bidang instance melalui referensi eksplisit jika izin akses mengizinkannya. - Mencoba menggunakan
thisdalam metode statis adalah kesalahan kompilasi. Jika Anda memerlukanthis, metode harus berupa metode instance, bukan statis.
Gunakan this.field = param; untuk mengatasi penumpukan nama — this.name adalah variabel instance, name biasa adalah parameter. Menulis name = name; (tanpa this) hanya menugaskan parameter kepada dirinya sendiri. Dan this tidak ada dalam metode statis — metode statis tidak memiliki objek tertentu, jadi menggunakan this di sana tidak akan bisa dikompilasi.
Type the field value after the faulty setName("Bo") call on the described object.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
The parameter assigns to itself; the field is unchanged until this.name is used on the left.
Jika alias dan a merujuk ke Student yang sama, alias.setName("Di") akan mengubah nama yang kemudian dibaca melalui a.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Kedua referensi mengidentifikasi objek penerima yang sama, whose field diperbarui.
Kode dalam objek b memanggil a.setName("Cy"). Di dalam setName, objek manakah yang merupakan this?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Penerima a menyediakan this, terlepas dari objek lain mana yang kode inisiasi pemanggilan.
Memperbaiki bug penumpukan nama dengan this:
- Variabel instance
private String name; void setName(String name) { this.name = name; }— benar!this.name(bidang) menerima nilai dariname(parameter).
Terapkan penalaran ke kasus baru
- Telusuri a dan b sebagai siswa yang dibuat terpisah bernama Ada dan Bo.
a.setName("Cy")mengubah a menjadi Cy sementara b tetap Bo. Jika alias=a,alias.setName("Di")mengubah objek pertama yang sama, sehingga a sekarang bernilai Di. - Penerima adalah objek tempat metode instance beroperasi, bukan necessarily objek yang kodenya memanggilnya. Metode statis dapat bekerja pada referensi objek eksplisit, tetapi tidak memiliki this implisit.
this merujuk ke objek saat ini — objek tempat metode instance dipanggil. Kegunaan utamanya adalah mengatasi penumpukan nama: this.name = name; menugaskan parameter ke variabel instance. Setiap metode instance memiliki this implisit, tetapi metode statis tidak memilikinya, sehingga this tidak bisa digunakan di sana.