new
, dan semuanya sudah siap :) Di sini kita akan berbicara tentang apa yang terjadi di dalam komputer dan mesin Java saat kita menulis, misalnya:
Cat cat = new Cat();
Kami telah membicarakan hal ini sebelumnya, tetapi untuk berjaga-jaga kami akan mengingatkan Anda:
- Pertama, memori untuk menyimpan objek dialokasikan.
- Selanjutnya, mesin Java membuat referensi ke objek (dalam kasus kami, referensinya adalah Cat cat).
- Terakhir, variabel diinisialisasi dan konstruktor dipanggil (kita akan melihat proses ini lebih detail).
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
adalah implementasi truk dengan bidang yang mewakili tahun, model, dan kecepatan maksimumnya. Sekarang kami ingin membuat satu objek seperti itu:
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 terlihat seperti ini:
-
Hal pertama yang terjadi adalah variabel statis kelas
Vehicle
diinisialisasi . Ya, saya bilang kelasnyaVehicle
, bukanTruck
. Variabel statis diinisialisasi sebelum konstruktor dipanggil, dan ini dimulai di kelas induk. Mari kita coba verifikasi ini. Kami menyetelvehicleCounter
bidang diVehicle
kelas sama dengan 10 dan mencoba menampilkannya diVehicle
danTruck
konstruktor.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 di awal konstruktor
Truck
untuk memastikan bahwa bidang truk belum diinisialisasi saatvehicleCounter
ditampilkan.Dan inilah hasilnya:
10 10
-
Setelah variabel statis kelas induk diinisialisasi, variabel statis kelas anak diinisialisasi. Dalam kasus kami, ini adalah
truckCounter
bidang kelasTruck
.Mari kita lakukan percobaan lain di mana kita akan mencoba menampilkan nilai
truckCounter
di dalamTruck
konstruktor sebelum bidang lain diinisialisasi: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 ditetapkan ke variabel statis kita saat
Truck
konstruktor dimulai. -
Masih belum waktunya untuk para konstruktor! Inisialisasi variabel berlanjut. Variabel non-statis dari kelas induk diinisialisasi ketiga. Seperti yang Anda lihat, warisan secara signifikan mempersulit proses pembuatan objek, tetapi tidak ada yang dapat Anda lakukan: Anda hanya perlu mengingat beberapa hal dalam pemrograman :)
Sebagai percobaan, kita dapat menetapkan beberapa nilai awal ke
description
variabel diVehicle
kelas, lalu mengubahnya di konstruktor.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()
metode kami yang membuat truk:public class Main { public static void main(String[] args) throws IOException { Truck truck = new Truck(2017, "Scania S 500 4x2", 220); } }
Kami mendapatkan hasil berikut:
Initial value of the description field Vehicle
Ini membuktikan bahwa ketika
Vehicle
konstruktor memulai,description
bidang telah diberi nilai. -
Akhirnya, saatnya para konstruktor! Lebih tepatnya, saatnya untuk konstruktor kelas dasar. Itu dipanggil pada langkah keempat dari proses pembuatan objek.
Ini juga cukup mudah untuk diverifikasi. Mari kita coba mengeluarkan dua baris ke konsol: satu di dalam
Vehicle
konstruktor kelas dasar, yang kedua di dalamTruck
konstruktor. Kita perlu diyakinkan bahwa baris di dalamnyaVehicle
ditampilkan 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()
metode kami dan melihat hasilnya:Hello from the Vehicle constructor! Hello from the Truck constructor!
Bagus sekali. Artinya kita tidak salah :) Mari kita lanjutkan.
-
Sekarang saatnya menginisialisasi bidang non-statis dari kelas anak, yaitu
Truck
kelas kita. Bidang yang langsung di dalam kelas yang sedang dibuat tidak diinisialisasi hingga langkah kelima! Mengejutkan, tapi benar :) Sekali lagi, kita akan melakukan pemeriksaan sederhana — sama seperti dengan kelas induk: kita akan memberikan beberapa nilai awal ke variabelmaxSpeed
dan diTruck
konstruktor kita akan memeriksa apakah nilainya telah ditetapkan sebelum konstruktor dimulai: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++; } }
Keluaran konsol:
Initial value of maxSpeed = 150
Seperti yang Anda lihat, saat
Truck
konstruktor dimulai,maxSpeed
sudah sama dengan 150! -
Konstruktor
Truck
kelas anak dipanggil.Dan hanya pada titik ini, yang terakhir, konstruktor kelas yang kita buat akan dipanggil!
Hanya pada langkah keenam bidang akan diberi nilai yang kami berikan sebagai argumen ke truk kami.
Seperti yang Anda lihat, "membangun" truk, yaitu proses pembuatan objek, tidaklah sederhana. Tapi sepertinya kita sudah memecahnya menjadi bagian-bagian terkecil :)
GO TO FULL VERSION