Permulaan Medan dalam Pembina Java
Di Java, susunan pelaksanaan permulaan medan dan kod pembina telah menjadi topik kekeliruan. Kod yang disediakan menunjukkan tingkah laku ini:
class X {
Y b = new Y();
X() {
System.out.print("X");
}
}
class Y {
Y() {
System.out.print("Y");
}
}
public class Z extends X {
Y y = new Y();
Z() {
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
Salin selepas log masuk
Orang mungkin menjangkakan outputnya ialah "XZYY" berdasarkan andaian bahawa pembina dimulakan sebelum pembolehubah contoh. Walau bagaimanapun, output sebenar ialah "YYXZ":
-
Y(): Pembina kelas Y dipanggil.
- Y(): Pembolehubah contoh 'b' dalam kelas X dimulakan dengan mencipta tika baharu 'Y'.
- X(): Pembina kelas X dipanggil.
- Y() baharu: Pembolehubah contoh 'y' dalam kelas Z dimulakan dengan mencipta tika baharu 'Y'.
- Z(): Pembina kelas Z dipanggil.
Output ini bercanggah dengan susunan yang dijangkakan kerana permulaan medan (cth., 'b' dan 'y') berlaku sebelum pelaksanaan badan pembina (cth., 'X() ' dan 'Z()').
Spesifikasi Mesin Maya Java (JVM Spec) menjelaskan susunan permulaan sebagai berikut:
Pemula pembolehubah statik dan blok pemulaan statik dilaksanakan.- Panggilan super() dalam pembina, jika ada.
- Pemula dan contoh pembolehubah instance blok pemulaan dilaksanakan dalam susunan teks.
- Baki badan pembina, termasuk sebarang kod selepas super().
-
Oleh itu, dalam kod yang disediakan, pembolehubah contoh 'b' dan 'y' dimulakan sebelum badan pembina 'X' dan 'Z' dilaksanakan, menghasilkan output "YYXZ".
Atas ialah kandungan terperinci Apakah Perintah Sebenar Permulaan Medan dan Pelaksanaan Pembina di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!