Scope and Access
Diperkenalkan| English | Makna |
|---|---|
| local variable/ˈləʊkl ˈveərɪəbl/ | variabel lokal |
| scope/skəʊp/ | scope |
| shadows/ˈʃædəʊz/ | penyamaran (shadows) |
Variabel lokal mereset; field mengingat
- Sebuah method membuat
int count = 0;, menambahkannya, dan mengembalikan 1. Memanggil method tersebut dua kali mengembalikan 1 kedua kalinya karena setiap pemanggilan memiliki variabel lokal baru. - Sebuah method yang menambah field objek alih-alih mengembalikan 1 dan kemudian 2 untuk objek yang sama yang awalnya bernilai nol. Bedakan di mana nama dapat digunakan dengan berapa lama keadaan yang disimpan dipertahankan.
Skop menyangkut nama dalam kode sumber
- Skop dari sebuah deklarasi adalah bagian program di mana namanya dapat digunakan. Blok lokal berada dalam skop sejak deklarasinya hingga sisa blok; variabel perulangan for tidak tersedia setelah perulangan itu.
- Skop, izin akses, dan masa hidup menjawab pertanyaan berbeda. Nama mungkin keluar dari skop meskipun objek yang pernah dirujuknya tetap terjangkau melalui referensi lain; field tidak diatur oleh aturan deklarasi yang sama dengan blok lokal.
Inisialisasi variabel lokal sebelum membacanya
- A variabel lokal dideklarasikan di dalam method atau blok. Java mengharuskannya definitely assigned (tertentu telah diberikan nilai) sebelum nilainya dibaca;
int x; return x;adalah kesalahan waktu kompilasi, bukan pengembalian otomatis bernilai nol. - Medan instance menerima nilai default selama konstruksi sebelum inisialisator dan kode konstruktor dijalankan. Dalam contoh ini, count dimulai dari 0; medan tersebut milik setiap objek dan bertahan di antara pemanggilan metodenya.
public class ScopeCounter {
private int count;
public int localCount() {
int count = 0;
count++;
return count;
}
public int rememberedCount() {
count++;
return count;
}
public void setCount(int count) {
this.count = count;
}
public static int readCount(ScopeCounter other) {
return other.count;
}
}
Deklarasi lokal int x; secara otomatis memberikan x nilai nol, sehingga return x; dapat dikompilasi.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Lokal harus pasti ditugaskan sebelum dibaca; default medan tidak berlaku untuk variabel lokal.
Parameter dapat menyembunyikan nama medan
- Parameter
countdalamsetCount(int count)menyembunyikan medan untuk penggunaan nama tanpa kualifikasi.count = count;akan menetapkan parameter pada dirinya sendiri;this.count = count;memperbarui medan penerima (receiver). - Variabel lokal juga dapat menyembunyikan medan, seperti yang ditunjukkan oleh localCount. Jangan menyimpulkan bahwa setiap deklarasi variabel lokal ganda diperbolehkan: mendeklarasikan ulang variabel lokal yang sudah berada dalam ruang nama di blok bersarang dari metode yang sama adalah kesalahan saat kompilasi.
The scope of a variable is...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Scope is where the name is valid.
Setelah pemanggilan metode biasa selesai, apakah pemanggil dapat menggunakan variabel lokal yang hanya dideklarasikan di dalam metode tersebut dengan namanya sendiri?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Nama lokal tidak berada dalam cakupan pemanggil. Objek yang dirujuk oleh nama lokal tersebut tetap dapat dikembalikan dan tetap dapat dijangkau.
Jenis variabel apa yang harus menyimpan keadaan yang harus diingat objek antara pemanggilan metode?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Instance variables persist for the object's lifetime.
Parameter dengan nama yang sama seperti variabel instance menaungi (menyembunyikan) variabel instance tersebut di dalam metode.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Di dalam metode, nama tersebut berarti parameter; gunakan this untuk mencapai medan.
Ketika parameter menaungi variabel instance dengan nama yang sama, hal itu disebut ___ dia (satu kata).
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Shadowing hides the field behind the local name.
Akses bergantung pada kelas pengumuman
- Kode di dalam ScopeCounter dapat membaca count private dari objek ScopeCounter lain melalui referensi eksplisit. Metode readCount statis yang ditampilkan tidak memiliki
this, tetapiother.countvalid untuk parameter yang tidak null. - Kelas eksternal yang tidak terkait tidak dapat membaca medan private tersebut secara langsung. Akses private tidak dibatasi hanya pada "objek saya sendiri"; metode instance memiliki penerima implisit, sementara metode statis memerlukan referensi eksplisit untuk mengakses keadaan instance.
Jangan menggabungkan ruang nama, inisialisasi default, dan akses private menjadi satu aturan. Variabel lokal tidak otomatis dimulai dari nol, medan instance tidak dapat dibaca tanpa kualifikasi dari metode statis, dan medan private dari instance lain dapat diakses di dalam kelas pengumumannya.
Cakupan, keadaan medan, dan izin akses
Pisahkan deklaras dari konteks akses;实例 lain tidak secara otomatis tidak dapat diakses.
Metode static readCount yang ditunjukkan mungkin membaca other.count ketika other bukan null.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Ini menggunakan referensi objek eksplisit dan berada di dalam kelas yang mendeklarasikan medan privat; tidak perlu this implisit.
Prediksikan penerima baru dan objek yang dikembalikan
- Setelah dua pemanggilan rememberedCount pada a, medannya menjadi 2; b yang baru dibuat masih memiliki count 0. Memanggil a.localCount() mengembalikan 1 tanpa mereset medan a, karena jumlah lokalnya menyembunyikan medan tersebut.
- Metode dapat membangun objek dalam variabel lokal dan mengembalikan referensinya. Nama lokal kemudian tidak tersedia untuk pemanggil, tetapi objek yang dikembalikan tetap dapat terjangkau; akhir ruang nama tidak menghancurkan objek tersebut.
Ruang nama menentukan di mana nama dapat digunakan; modifikator akses mengontrol izin; keadaan objek dapat bertahan lebih lama daripada referensi lokal. Inisialisasilah variabel lokal sebelum membacanya, gunakan medan untuk keadaan ingatan per-objek, dan bedakan penyembunyian dengan akses ke medan private objek lain.
Untuk ScopeCounter a yang baru dibuat, panggil a.rememberedCount() dua kali, lalu a.localCount(). Apa yang dikembalikan oleh a.localCount()?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
localCount memiliki hitung lokal segar yang diinisialisasi menjadi nol; ia incremented dan mengembalikan 1 tanpa mengubah medan.