
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).

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 Truck
ialah 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
Vehicle
dimulakan . Ya, saya kataVehicle
kelas, bukanTruck
. Pembolehubah statik dimulakan sebelum pembina dipanggil, dan ini bermula dalam kelas induk. Mari cuba sahkan ini. Kami menetapkanvehicleCounter
medan dalamVehicle
kelas sama dengan 10 dan cuba memaparkannya dalam kedua-duaVehicle
danTruck
pembina.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
Truck
untuk memastikan bahawa medan trak masih belum dimulakan apabilavehicleCounter
dipaparkan.Dan inilah hasilnya:
10 10
-
Selepas pembolehubah statik kelas induk dimulakan, pembolehubah statik kelas anak dimulakan. Dalam kes kami, ini adalah
truckCounter
bidang kelasTruck
.Mari kita lakukan percubaan lain di mana kita akan cuba memaparkan nilai
truckCounter
di dalamTruck
pembina 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
Truck
pembina 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
description
pembolehubah dalamVehicle
kelas, 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 Vehicle
Ini membuktikan bahawa apabila
Vehicle
pembina memulakandescription
medan 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
Vehicle
pembina kelas asas, yang kedua di dalamTruck
pembina. Kita perlu yakin bahawa baris di dalamVehicle
dipaparkan 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
Truck
kelas 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 pembolehubahmaxSpeed
dan dalamTruck
pembina 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 = 150
Seperti yang anda lihat, apabila
Truck
pembina bermula,maxSpeed
sudah bersamaan dengan 150! -
Pembina
Truck
kelas 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 :)

GO TO FULL VERSION