Animal
(hewan):
public class Animal {
String name;
int age;
}
Kita dapat membuatnya, misalnya, 2 kelas turunan - Cat
dan Dog
. Hal ini dilakukan dengan menggunakan kata kunci extends
.
public class Cat extends Animal {
}
public class Dog extends Animal {
}
Ini mungkin berguna bagi kita di masa depan. Misal tugasnya menangkap tikus, kita akan membuat objek di program tersebut Cat
. Jika tugasnya dijalankan setelah tongkat, maka kita menggunakan objek Dog
. Dan jika kita membuat program yang menyimulasikan klinik hewan, program tersebut akan bekerja dengan kelas Animal
(agar dapat merawat kucing dan anjing). Sangat penting untuk diingat di masa depan bahwa ketika membuat sebuah objek, konstruktor kelas dasarnya dipanggil terlebih dahulu , dan baru kemudian konstruktor kelas itu sendiri, objek yang kita buat, dipanggil. Artinya, saat membuat objek, Cat
konstruktor kelas akan bekerja terlebih dahulu Animal
, baru kemudian konstruktor Cat
. Untuk memastikan hal ini, mari tambahkan konstruktor Cat
dan Animal
keluaran ke konsol.
public class Animal {
public Animal() {
System.out.println("Animal constructor completed");
}
}
public class Cat extends Animal {
public Cat() {
System.out.println("The constructor Cat worked!");
}
public static void main(String[] args) {
Cat cat = new Cat();
}
}
Keluaran konsol:
Отработал конструктор Animal
Отработал конструктор Cat!
Memang benar, beginilah cara kerjanya! Untuk apa? Misalnya, untuk menghindari duplikasi bidang umum dari dua kelas. Misalnya, setiap hewan mempunyai jantung dan otak, tetapi tidak semua hewan mempunyai ekor. Kita dapat mendeklarasikan field yang umum untuk semua hewan brain
di heart
kelas induk Animal
, dan sebuah field tail
di subkelas Cat
. Sekarang kita akan membuat konstruktor untuk kelas tersebut Cat
, di mana kita akan meneruskan ketiga bidang tersebut.
public class Cat extends Animal {
String tail;
public Cat(String brain, String heart, String tail) {
this.brain = brain;
this.heart = heart;
this.tail = tail;
}
public static void main(String[] args) {
Cat cat = new Cat("Brain", "Heart", "Tail");
}
}
Perhatian:konstruktor bekerja dengan sukses, meskipun kelas Cat
tidak memiliki bidang brain
dan heart
. Bidang-bidang ini “ditarik” dari kelas dasar Animal
. Kelas turunan memiliki akses ke bidang kelas dasar, sehingga Cat
bidang tersebut terlihat di kelas kita. Oleh karena itu, kita tidak perlu Cat
menduplikasi bidang ini di kelas - kita dapat mengambilnya dari kelas Animal
. Selain itu, kita dapat secara eksplisit memanggil konstruktor kelas dasar di konstruktor kelas turunan. Kelas dasar juga disebut “ superclass ,” itulah sebabnya Java menggunakan kata kunci super
. Pada contoh sebelumnya
public Cat(String brain, String heart, String tail) {
this.brain = brain;
this.heart = heart;
this.tail = tail;
}
Kami secara terpisah menugaskan setiap bidang yang ada di kelas induk kami. Sebenarnya, Anda tidak perlu melakukan ini. Cukup dengan memanggil konstruktor kelas induk dan meneruskan parameter yang diperlukan:
public class Animal {
String brain;
String heart;
public Animal(String brain, String heart) {
this.brain = brain;
this.heart = heart;
}
public class Cat extends Animal {
String tail;
public Cat(String brain, String heart, String tail) {
super(brain, heart);
this.tail = tail;
}
public static void main(String[] args) {
Cat cat = new Cat("Brain", "Heart", "Tail");
}
}
Di konstruktor, Cat
kami memanggil konstruktor Animal
dan meneruskan dua bidang ke dalamnya. Kita hanya perlu menginisialisasi satu bidang secara eksplisit - tail
yang Animal
tidak ada. Ingat bagaimana kami mengatakan bahwa ketika sebuah objek dibuat, konstruktor kelas induk dipanggil terlebih dahulu? Jadi, inilah mengapa kata super()
harus selalu didahulukan dalam konstruktor! Jika tidak, logika konstruktor akan rusak dan program akan menghasilkan kesalahan.
public class Cat extends Animal {
String tail;
public Cat(String brain, String heart, String tail) {
this.tail = tail;
super(brain, heart);//error!
}
public static void main(String[] args) {
Cat cat = new Cat("Brain", "Heart", "Tail");
}
}
Kompiler mengetahui bahwa saat membuat objek dari kelas turunan, konstruktor kelas dasar dipanggil terlebih dahulu. Dan jika Anda mencoba mengubah perilaku ini secara manual, itu tidak akan mengizinkannya.
Proses pembuatan suatu objek.
Di atas kita melihat contoh dengan kelas dasar dan kelas induk -Animal
dan Cat
. Sekarang, dengan menggunakan dua kelas ini sebagai contoh, kita akan melihat proses pembuatan objek dan inisialisasi variabel. Kita tahu bahwa variabel adalah variabel statis dan variabel instan (non-statis). Kita juga tahu bahwa kelas dasar Animal
mempunyai variabelnya sendiri, dan kelas turunannya Cat
mempunyai variabelnya sendiri. Mari tambahkan satu variabel statis ke kelas untuk Animal
kejelasan . Cat
Variabel animalCount
kelasnya Animal
adalah jumlah total spesies hewan di bumi, dan variabelnya catsCount
adalah jumlah spesies kucing. Selain itu, kami akan menetapkan nilai awal ke semua variabel non-statis dari kedua kelas (yang kemudian akan diubah di konstruktor).
public class Animal {
String brain = "The initial value of brain in the Animal class";
String heart = "The initial value of heart in the Animal class";
public static int animalCount = 7700000;
public Animal(String brain, String heart) {
System.out.println("The constructor of the Animal base class is being executed");
System.out.println("Have the variables of the Animal class already been initialized?");
System.out.println("The current value of the static variable animalCount = " + animalCount);
System.out.println("Current value of brain in class Animal = " + this.brain);
System.out.println("Current value of heart in class Animal = " + this.heart);
System.out.println("Have the variables of the Cat class already been initialized?");
System.out.println("The current value of the static variable catsCount = " + Cat.catsCount);
this.brain = brain;
this.heart = heart;
System.out.println("Animal base class constructor completed!");
System.out.println("Current value of brain = " + this.brain);
System.out.println("Current value of heart = " + this.heart);
}
}
public class Cat extends Animal {
String tail = "The initial value of tail in the Cat class";
static int catsCount = 37;
public Cat(String brain, String heart, String tail) {
super(brain, heart);
System.out.println("The constructor of the Cat class has started (the Animal constructor has already been executed)");
System.out.println("The current value of the static variable catsCount = " + catsCount);
System.out.println("Current value tail = " + this.tail);
this.tail = tail;
System.out.println("Current value tail = " + this.tail);
}
public static void main(String[] args) {
Cat cat = new Cat("Brain", "Heart", "Tail");
}
}
Jadi, kita membuat objek baru dari kelas Cat
yang diwarisi dari Animal
. Mari tambahkan keluaran konsol terperinci ke program kita untuk melihat apa yang akan terjadi dan dalam urutan apa. Inilah yang akan menjadi output ke konsol sebagai hasil pembuatan objek Cat
:
Выполняется конструктор базового класса Animal
Были ли уже проинициализированы переменные класса Animal?
Текущее meaning статической переменной animalCount = 7700000
Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
Были ли уже проинициализированы переменные класса Cat?
Текущее meaning статической переменной catsCount = 37
Конструктор базового класса Animal завершил работу!
Текущее meaning brain = Мозг
Текущее meaning heart = Сердце
Конструктор класса Cat начал работу (конструктор Animal уже был выполнен)
Текущее meaning статической переменной catsCount = 37
Текущее meaning tail = Изначальное meaning tail в классе Cat
Текущее meaning tail = Хвост
Jadi, sekarang kita dapat dengan jelas melihat urutan variabel yang diinisialisasi dan pemanggilan konstruktor saat membuat objek baru:
-
Variabel statis kelas dasar ( ) diinisialisasi
Animal
. Dalam kasus kami, variabelanimalCount
kelasAnimal
diberi nilai 7700000. -
Variabel statis dari kelas turunan ( ) diinisialisasi
Cat
. Perhatikan - kita masih berada di dalam konstruktorAnimal
, dan konsol sudah mengatakan:Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal Были ли уже проинициализированы переменные класса Cat? Текущее meaning статической переменной catsCount = 37
-
Selanjutnya, variabel non-statis dari kelas dasar diinisialisasi . Kami secara khusus menetapkan nilai awal kepada mereka, yang kemudian diubah ke nilai baru di konstruktor. Konstruktor
Animal
belum menyelesaikan pekerjaannya, tetapi nilai awalbrain
telahheart
ditetapkan:Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
-
Konstruktor kelas dasar mulai bekerja .
Kita telah melihat bahwa tahap ini hanyalah tahap keempat: dalam tiga poin pertama, pada saat konstruktor mulai bekerja,
Animal
banyak variabel telah diberi nilai. -
Menginisialisasi bidang non-statis dari kelas anak (
Cat
).Itu terjadi sebelum desainer
Cat
mulai bekerja.Pada saat dia mulai bekerja, variabel tersebut
tail
sudah memiliki nilai:Конструктор класса Cat начал работу (конструктор Animal уже был выполнен) Текущее meaning статической переменной catsCount = 37 Текущее meaning tail = Изначальное meaning tail в классе Cat
-
Konstruktor kelas turunan disebut
Cat
GO TO FULL VERSION