Kami akan menganalisisnya dari awal hingga akhir: bagaimana pembina dipanggil, bagaimana dan dalam apakah medan tertib (termasuk medan statik) dimulakan, dsb. Kami sebelum ini telah menyentuh beberapa perkara yang dibincangkan dalam artikel, supaya anda boleh melihat sekilas bahan pada pembina kelas asas . Mula-mula, mari kita ingat semula bagaimana objek dicipta. Anda masih ingat bagaimana proses ini kelihatan dari sudut pandangan pembangun: dia mencipta kelas, menulis new, dan semuanya sudah sedia :) Di sini kita akan bercakap tentang perkara yang berlaku di dalam komputer dan mesin Java apabila kita menulis, sebagai contoh:
Cat cat = new Cat();
Kami telah membincangkan perkara ini sebelum ini, tetapi untuk berjaga-jaga kami akan mengingatkan anda:
- Pertama, memori untuk menyimpan objek diperuntukkan.
- Seterusnya, mesin Java mencipta rujukan kepada objek (dalam kes kami rujukannya ialah kucing Cat).
- Akhirnya, pembolehubah dimulakan dan pembina dipanggil (kita akan melihat proses ini dengan lebih terperinci).
Dua perkara pertama ini tidak sepatutnya menimbulkan sebarang persoalan khas. Peruntukan memori adalah proses yang mudah, dan hanya terdapat dua kemungkinan hasil: sama ada terdapat memori atau tidak :) Dan mencipta pautan bukanlah sesuatu yang luar biasa. Tetapi titik ketiga mewakili satu set keseluruhan operasi yang dilaksanakan dalam susunan yang ketat. Saya bukan peminat menjejalkan ujian, tetapi anda perlu memahami proses ini dengan baik dan anda perlu menghafal urutan operasi ini. Apabila kita bercakap tentang proses penciptaan objek dalam pelajaran sebelumnya, anda masih belum tahu apa-apa tentang warisan, jadi menjelaskan beberapa perkara adalah bermasalah. Sekarang anda tahu banyak perkara dan akhirnya kami boleh mempertimbangkan soalan ini sepenuhnya :) Jadi perkara ketiga berkata " Akhirnya, pembolehubah dimulakan dan pembina dipanggil. " Tetapi dalam urutan apakah semua ini berlaku? Untuk pemahaman yang lebih baik, mari kita cipta dua kelas yang sangat mudah — ibu bapa dan anak:
public class Vehicle {
public static int vehicleCounter = 0;
private String description = "Vehicle";
public Vehicle() {
}
public String getDescription() {
return description;
}
}
public class Truck extends Vehicle {
private static int truckCounter = 0;
private int yearOfManufacture;
private String model;
private int maxSpeed;
public Truck(int yearOfManufacture, String model, int maxSpeed) {
this.yearOfManufacture = yearOfManufacture;
this.model = model;
this.maxSpeed = maxSpeed;
Vehicle.vehicleCounter++;
truckCounter++;
}
}
Kelas Truckialah pelaksanaan trak dengan medan yang mewakili tahun, model dan kelajuan maksimumnya. Sekarang kita mahu mencipta satu objek sedemikian:
public class Main {
public static void main(String[] args) throws IOException {
Truck truck = new Truck(2017, "Scania S 500 4x2", 220);
}
}
Untuk mesin Java, prosesnya akan kelihatan seperti ini:
-
Perkara pertama yang berlaku ialah pembolehubah statik kelas
Vehicledimulakan . Ya, saya kataVehiclekelas, bukanTruck. Pembolehubah statik dimulakan sebelum pembina dipanggil, dan ini bermula dalam kelas induk. Mari cuba sahkan ini. Kami menetapkanvehicleCountermedan dalamVehiclekelas sama dengan 10 dan cuba memaparkannya dalam kedua-duaVehicledanTruckpembina.public class Vehicle { public static int vehicleCounter = 10; private String description = "Vehicle"; public Vehicle() { System.out.println(vehicleCounter); } public String getDescription() { return description; } } public class Truck extends Vehicle { private static int truckCount = 0; private int yearOfManufacture; private String model; private int maxSpeed; public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println(vehicleCounter); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCount++; } }Kami sengaja meletakkan pernyataan println pada permulaan pembina
Truckuntuk memastikan bahawa medan trak masih belum dimulakan apabilavehicleCounterdipaparkan.Dan inilah hasilnya:
10 10 -
Selepas pembolehubah statik kelas induk dimulakan, pembolehubah statik kelas anak dimulakan. Dalam kes kami, ini adalah
truckCounterbidang kelasTruck.Mari kita lakukan percubaan lain di mana kita akan cuba memaparkan nilai
truckCounterdi dalamTruckpembina sebelum medan lain dimulakan:public class Truck extends Vehicle { private static int truckCounter = 10; private int yearOfManufacture; private String model; private int maxSpeed; public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println(truckCounter); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCounter++; } }Seperti yang anda lihat, nilai 10 telah pun diberikan kepada pembolehubah statik kami apabila
Truckpembina bermula. -
Masih belum masanya untuk pembina! Inisialisasi pembolehubah diteruskan. Pembolehubah bukan statik kelas induk dimulakan ketiga. Seperti yang anda lihat, pewarisan merumitkan proses mencipta objek dengan ketara, tetapi tiada apa yang boleh anda lakukan mengenainya: Anda hanya perlu menghafal beberapa perkara dalam pengaturcaraan :)
Sebagai percubaan, kita boleh menetapkan beberapa nilai awal kepada
descriptionpembolehubah dalamVehiclekelas, dan kemudian menukarnya dalam pembina.public class Vehicle { public static int vehicleCounter = 10; private String description = "Initial value of the description field"; public Vehicle() { System.out.println(description); description = "Vehicle"; System.out.println(description); } public String getDescription() { return description; } }Mari jalankan
main()kaedah kami yang mencipta trak:public class Main { public static void main(String[] args) throws IOException { Truck truck = new Truck(2017, "Scania S 500 4x2", 220); } }Kami mendapat keputusan berikut:
Initial value of the description field VehicleIni membuktikan bahawa apabila
Vehiclepembina memulakandescriptionmedan telah diberikan nilai. -
Akhirnya, sudah tiba masanya untuk pembina! Lebih tepat lagi, sudah tiba masanya untuk pembina kelas asas. Ia digunakan dalam langkah keempat proses penciptaan objek.
Ini juga agak mudah untuk disahkan. Mari cuba mengeluarkan dua baris ke konsol: satu di dalam
Vehiclepembina kelas asas, yang kedua di dalamTruckpembina. Kita perlu yakin bahawa baris di dalamVehicledipaparkan terlebih dahulu:public Vehicle() { System.out.println("Hello from the Vehicle constructor!"); } public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println("Hello from the Truck constructor!"); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCounter++; }Kami akan menjalankan
main()kaedah kami dan melihat hasilnya:Hello from the Vehicle constructor! Hello from the Truck constructor!Cemerlang. Maknanya kita tak silap :) Jom teruskan.
-
Kini tiba masanya untuk memulakan medan bukan statik kelas kanak-kanak, iaitu
Truckkelas kami. Medan serta-merta dalam kelas yang dimulakan tidak dimulakan sehingga langkah kelima! Mengejutkan, tetapi benar :) Sekali lagi, kami akan melakukan semakan mudah — sama seperti kelas induk: kami akan beberapa nilai awal kepada pembolehubahmaxSpeeddan dalamTruckpembina kami akan menyemak bahawa nilai telah diberikan sebelum pembina bermula:public class Truck extends Vehicle { private static int truckCounter = 10; private int yearOfManufacture; private String model; private int maxSpeed = 150; public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println("Initial value of maxSpeed = " + this.maxSpeed); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCounter++; } }Output konsol:
Initial value of maxSpeed = 150Seperti yang anda lihat, apabila
Truckpembina bermula,maxSpeedsudah bersamaan dengan 150! -
Pembina
Truckkelas kanak-kanak dipanggil.Dan hanya pada ketika ini, yang terakhir sekali, pembina kelas yang kita sedang gunakan akan dipanggil!
Hanya dalam langkah keenam, medan akan diberikan nilai yang kami berikan sebagai hujah kepada trak kami.
Seperti yang anda lihat, "membina" trak, iaitu proses penciptaan objek, bukanlah mudah. Tetapi nampaknya kita telah memecahkannya kepada bahagian yang paling kecil :)
Mengapa sangat penting untuk memahami proses ini dengan baik? Bayangkan betapa tidak dijangka hasil mencipta objek biasa jika anda tidak tahu dengan tepat apa yang berlaku "di bawah tudung" :) Kini tiba masanya untuk kembali ke kursus dan menyelesaikan beberapa tugas! Semoga berjaya dan jumpa lagi! :)
GO TO FULL VERSION