Animal
(haiwan):
public class Animal {
String name;
int age;
}
Kita boleh mencipta untuknya, sebagai contoh, 2 kelas keturunan - Cat
dan Dog
. Ini dilakukan menggunakan kata kunci extends
.
public class Cat extends Animal {
}
public class Dog extends Animal {
}
Ini mungkin berguna kepada kita di masa hadapan. Sebagai contoh, jika tugasnya adalah untuk menangkap tikus, kami akan mencipta objek dalam program Cat
. Jika tugasnya adalah untuk mengejar kayu, maka kita menggunakan objek Dog
. Dan jika kita mencipta program yang menyerupai klinik veterinar, ia akan berfungsi dengan kelas Animal
(untuk dapat merawat kedua-dua kucing dan anjing). Adalah sangat penting untuk diingati untuk masa depan bahawa apabila mencipta objek, pembina kelas asasnya dipanggil first , dan hanya kemudian pembina kelas itu sendiri, objek yang kita cipta, dipanggil. Iaitu, apabila mencipta objek, Cat
pembina kelas akan berfungsi terlebih dahulu Animal
, dan hanya kemudian pembina Cat
. Untuk memastikan ini, mari tambahkan pada pembina Cat
dan Animal
output pada 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();
}
}
Output konsol:
Отработал конструктор Animal
Отработал конструктор Cat!
Sesungguhnya, ini adalah cara semuanya berfungsi! Untuk apa itu? Contohnya, untuk mengelakkan penduaan medan biasa dua kelas. Sebagai contoh, setiap haiwan mempunyai jantung dan otak, tetapi tidak setiap haiwan mempunyai ekor. Kita boleh mengisytiharkan medan biasa kepada semua haiwan brain
dalam heart
kelas induk Animal
dan medan tail
dalam subkelas Cat
. Sekarang kita akan mencipta pembina untuk class Cat
, di mana kita akan melepasi semua 3 medan.
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");
}
}
Beri perhatian:pembina berfungsi dengan jayanya, walaupun kelas Cat
tidak mempunyai medan brain
dan heart
. Medan ini "ditarik" daripada kelas asas Animal
. Kelas keturunan mempunyai akses kepada medan kelas asas, jadi Cat
mereka boleh dilihat dalam kelas kami. Oleh itu, kita tidak perlu Cat
menduplikasi medan ini dalam kelas - kita boleh mengambilnya dari kelas Animal
. Selain itu, kita boleh memanggil secara eksplisit pembina kelas asas dalam pembina kelas keturunan. Kelas asas juga dipanggil " superclass ", itulah sebabnya Java menggunakan kata kunci super
. Dalam contoh sebelum ini
public Cat(String brain, String heart, String tail) {
this.brain = brain;
this.heart = heart;
this.tail = tail;
}
Kami secara berasingan menetapkan setiap medan yang ada dalam kelas induk kami. Sebenarnya, anda tidak perlu melakukan ini. Ia cukup untuk memanggil pembina kelas induk dan lulus 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");
}
}
Dalam pembina, Cat
kami memanggil pembina Animal
dan lulus dua medan kepadanya. Kami hanya perlu memulakan secara eksplisit satu medan - tail
yang Animal
tidak ada. Ingat bagaimana kami mengatakan bahawa apabila objek dicipta, pembina kelas induk dipanggil terlebih dahulu? Jadi, inilah sebabnya perkataan itu super()
harus sentiasa didahulukan dalam pembina! Jika tidak, logik pembina akan rosak dan program akan menghasilkan ralat.
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");
}
}
Pengkompil mengetahui bahawa apabila mencipta objek kelas keturunan, pembina kelas asas dipanggil terlebih dahulu. Dan jika anda cuba mengubah tingkah laku ini secara manual, ia tidak akan membenarkannya.
Proses mencipta objek.
Di atas kita melihat contoh dengan kelas asas dan induk -Animal
dan Cat
. Sekarang, menggunakan kedua-dua kelas ini sebagai contoh, kita akan melihat proses mencipta objek dan memulakan pembolehubah. Kita tahu bahawa pembolehubah adalah statik dan pembolehubah contoh (bukan statik). Kita juga tahu bahawa kelas asas Animal
mempunyai pembolehubah sendiri, dan kelas keturunan Cat
mempunyai sendiri. Mari tambah satu pembolehubah statik ke kelas untuk Animal
kejelasan . Cat
Pembolehubah animalCount
kelas Animal
ialah jumlah bilangan spesies haiwan di bumi, dan pembolehubah catsCount
ialah bilangan spesies kucing. Di samping itu, kami akan menetapkan nilai permulaan kepada semua pembolehubah bukan statik kedua-dua kelas (yang kemudiannya akan berubah dalam pembina).
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, kami mencipta objek baharu kelas Cat
yang diwarisi daripada Animal
. Mari tambahkan output konsol terperinci pada program kami untuk melihat apa yang akan berlaku dan dalam susunan apa. Inilah yang akan dikeluarkan kepada konsol hasil daripada mencipta 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 melihat dengan jelas dalam pembolehubah urutan apa yang dimulakan dan pembina dipanggil apabila mencipta objek baharu:
-
Pembolehubah statik kelas asas ( ) dimulakan
Animal
. Dalam kes kami, pembolehubahanimalCount
kelasAnimal
diberikan nilai 7700000. -
Pembolehubah statik kelas keturunan ( ) dimulakan
Cat
. Beri perhatian - kami masih berada di dalam constructorAnimal
, dan konsol sudah berkata:Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal Были ли уже проинициализированы переменные класса Cat? Текущее meaning статической переменной catsCount = 37
-
Seterusnya, pembolehubah bukan statik kelas asas dimulakan . Kami secara khusus memberikan mereka nilai awal, yang kemudiannya ditukar kepada yang baharu dalam pembina. Pembina
Animal
belum menyelesaikan kerjanya, tetapi nilai awalbrain
telahheart
diberikan:Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
-
Pembina kelas asas mula berfungsi .
Kami telah melihat bahawa peringkat ini hanyalah peringkat keempat: dalam tiga mata pertama, pada masa pembina mula berfungsi,
Animal
banyak pembolehubah telah diberikan nilai. -
Memulakan medan bukan statik bagi kelas kanak-kanak (
Cat
).Ia berlaku sebelum pereka bentuk
Cat
mula bekerja.Pada masa dia mula bekerja, pembolehubah
tail
sudah mempunyai nilai:Конструктор класса Cat начал работу (конструктор Animal уже был выполнен) Текущее meaning статической переменной catsCount = 37 Текущее meaning tail = Изначальное meaning tail в классе Cat
-
Pembina kelas keturunan dipanggil
Cat
GO TO FULL VERSION