Kekeliruan dalam Java Field Initialization: The Role of Shadowing
Apabila mengisytiharkan dan memulakan medan dalam pembina kelas, anda mungkin menghadapi kejadian yang membingungkan : medan kekal batal atau mengekalkan nilai lalainya walaupun terdapat usaha pemulaan anda. Ini berlaku disebabkan oleh fenomena yang dikenali sebagai membayang.
Skop dan Bayang
Setiap entiti di Java mempunyai skop, yang menentukan di mana ia boleh dirujuk menggunakan nama mudahnya. Apabila anda mengisytiharkan medan dalam kelas, ia mempunyai skop yang merangkumi seluruh badan kelas, termasuk pengisytiharan bersarang.
Pembolehubah Tempatan lwn. Medan
Dalam pembina, anda mungkin secara tidak sengaja memperkenalkan pembolehubah tempatan dengan nama yang sama seperti medan anda. Pembolehubah tempatan mempunyai skop yang lebih sempit, hanya meluas dalam badan pembina. Apabila pembolehubah tempatan diisytiharkan dengan nama yang sama seperti medan, ia membayangi medan, bermakna pembolehubah tempatan diutamakan dalam skopnya.
Contoh Membayangkan:
Pertimbangkan kod ini:
public class Sample { private String[] elements; private int capacity; public Sample() { int capacity = 10; String[] elements; elements = new String[capacity]; } }
Di sini, pembayang pembina menyebabkan kekeliruan. Kapasiti pembolehubah tempatan dan elemen diutamakan berbanding medan, menyebabkan ahli medan kekal batal atau dimulakan kepada nilai lalainya (0 untuk int, nol untuk rujukan).
Potensi Penyelesaian:
Untuk mengelakkan bayang-bayang, pertimbangkan untuk menggunakan nama unik untuk pembolehubah setempat atau secara eksplisit merujuk kepada medan menggunakan nama yang layak (cth., ini.elemen, ini.kapasiti). Contohnya:
public Sample() { this.capacity = 10; this.elements = new String[capacity]; }
Kejadian Lain Pembayang
Bayangan juga boleh berlaku dengan parameter pembina. Jika parameter pembina mempunyai nama yang sama dengan medan, parameter diutamakan dalam badan pembina. Untuk mengakses medan dalam kes sedemikian, gunakan nama yang layak dengan ini.
Pengesyoran Pengelakan:
Untuk mengelakkan tingkah laku yang tidak dijangka akibat membayangi, biasanya dinasihatkan untuk menggunakan yang berbeza nama untuk medan, pembolehubah tempatan dan parameter pembina.
Atas ialah kandungan terperinci Mengapa Medan Java Saya Nol Walaupun Dimulakan dalam Pembina?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!