Animal
kelas:
public class Animal {
String name;
int age;
}
Kami boleh mengisytiharkan 2 kelas kanak-kanak: Cat
dan Dog
. Ini dilakukan menggunakan kata kunci extends .
public class Cat extends Animal {
}
public class Dog extends Animal {
}
Kami mungkin mendapati ini berguna pada masa hadapan. Sebagai contoh, jika terdapat tugas untuk menangkap tikus, kami akan mencipta Cat
objek dalam program kami. Jika tugasnya adalah untuk mengejar kayu, maka kita akan menggunakan Dog
objek. Dan jika kita mencipta program yang menyerupai klinik veterinar, ia akan berfungsi dengan Animal
kelas (dan dengan itu dapat merawat kedua-dua kucing dan anjing). Adalah sangat penting untuk diingat bahawa apabila objek dicipta, pembina kelas asasnya pertama kali dipanggil . Hanya selepas pembina itu selesai barulah program melaksanakan pembina kelas yang sepadan dengan objek yang kita cipta. Dalam erti kata lain, apabila mencipta Cat
objek, pembina Animal
dijalankan dahulu , dan hanya selepas ituCat
pembina dilaksanakan . Untuk melihat ini, tambahkan beberapa output konsol pada Cat
dan Animal
pembina.
public class Animal {
public Animal() {
System.out.println("Animal constructor executed");
}
}
public class Cat extends Animal {
public Cat() {
System.out.println("Cat constructor executed!");
}
public static void main(String[] args) {
Cat cat = new Cat();
}
}
Output konsol: Pembina haiwan dilaksanakan Pembina kucing dilaksanakan! Sesungguhnya, ia berfungsi dengan cara itu! kenapa? Satu sebab adalah untuk mengelakkan penduaan medan yang dikongsi antara kedua-dua kelas. Sebagai contoh, setiap haiwan mempunyai jantung dan otak, tetapi tidak setiap haiwan mempunyai ekor. Kami boleh mengisytiharkan medan otak dan jantung , yang biasa kepada semua haiwan, dalam Animal
kelas induk, dan medan ekor dalam Cat
subkelas. . Sekarang kita akan mengisytiharkan Cat
pembina kelas yang mengambil hujah untuk 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");
}
}
Nota: Pembina berfungsi dengan betul walaupun kelas Cat
tidak mempunyai medan otak dan jantung . Medan ini "diwarisi" daripada Animal
kelas asas. Kelas pewarisan mempunyai akses kepada medan kelas asas , jadi mereka boleh dilihat dalam Cat
kelas kami. Akibatnya, kita tidak perlu menduplikasi medan ini dalam Cat
kelas. Kita boleh ambil mereka dari Animal
kelas. Lebih-lebih lagi, kita boleh memanggil pembina kelas asas secara eksplisit dalam pembina kelas kanak-kanak. Kelas asas juga dipanggil " kelas super ". Itulah sebabnya Java menggunakan kata kunci super untuk menunjukkan kelas asas. 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 bidang dalam kelas induk kami. Kita sebenarnya tidak perlu melakukan ini. Ia cukup untuk memanggil pembina kelas induk dan lulus hujah 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 Cat
pembina, kami memanggil Animal
pembina dan melepasi dua medan. Kami hanya mempunyai satu medan untuk dimulakan secara eksplisit: tail , yang tiada dalam Animal
. Ingat kita menyebut bahawa pembina kelas induk dipanggil dahulu apabila objek dicipta? Itulah sebabnya super() harus sentiasa menjadi yang pertama dalam pembina! Jika tidak, logik pembina akan dilanggar 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 objek kelas kanak-kanak dicipta, pembina kelas asas dipanggil terlebih dahulu. Dan jika anda cuba mengubah tingkah laku ini secara manual, pengkompil tidak akan membenarkannya.
Bagaimana sesuatu objek dicipta
Kami sebelum ini melihat contoh dengan kelas asas dan induk:Animal
dan Cat
. Menggunakan kedua-dua kelas ini sebagai contoh, kita kini akan melihat proses mencipta objek dan memulakan pembolehubah. Kami tahu bahawa terdapat pembolehubah statik dan contoh (bukan statik) . Kami juga tahu bahawa Animal
kelas asas mempunyai pembolehubah, dan Cat
kelas kanak-kanak mempunyai kelasnya sendiri. Untuk kejelasan, kami akan menambah satu pembolehubah statik setiap satu pada Animal
dan Cat
kelas. Pembolehubah animalCount dalam Animal
kelas akan mewakili jumlah bilangan spesies haiwan di Bumi, dan catCountpembolehubah akan menandakan bilangan spesies kucing. Selain itu, kami akan memberikan nilai permulaan kepada semua pembolehubah bukan statik dalam kedua-dua kelas (yang kemudiannya akan ditukar dalam pembina).
public class Animal {
String brain = "Initial value of brain in the Animal class";
String heart = "Initial value of heart in the Animal class";
public static int animalCount = 7700000;
public Animal(String brain, String heart) {
System.out.println("Animal base class constructor is running");
System.out.println("Have the variables of the Animal class already been initialized?");
System.out.println("Current value of static variable animalCount = " + animalCount);
System.out.println("Current value of brain in the Animal class = " + this.brain);
System.out.println("Current value of heart in the Animal class = " + this.heart);
System.out.println("Have the variables of the Cat class already been initialized?");
System.out.println("Current value of static variable catCount = " + Cat.catCount);
this.brain = brain;
this.heart = heart;
System.out.println("Animal base class constructor is done!");
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 = "Initial value of tail in the Cat class";
static int catCount = 37;
public Cat(String brain, String heart, String tail) {
super(brain, heart);
System.out.println("The cat class constructor has started (The Animal constructor already finished)");
System.out.println("Current value of static variable catCount = " + catCount);
System.out.println("Current value of tail = " + this.tail);
this.tail = tail;
System.out.println("Current value of tail = " + this.tail);
}
public static void main(String[] args) {
Cat cat = new Cat("Brain", "Heart", "Tail");
}
}
Oleh itu, kami sedang mencipta contoh baharu kelas Cat
, yang mewarisi Animal
. Kami telah menambah beberapa keluaran konsol terperinci untuk melihat apa yang berlaku dan mengikut susunan. Inilah yang akan dipaparkan apabila Cat
objek dibuat: Pembina kelas asas haiwan sedang berjalan Adakah pembolehubah kelas Haiwan telah dimulakan? Nilai semasa haiwan pembolehubah statikCount = 7700000 Nilai semasa otak dalam kelas Haiwan = Nilai awal otak dalam kelas Haiwan Nilai semasa jantung dalam kelas Haiwan = Nilai awal jantung dalam kelas Haiwan Mempunyai pembolehubah kelas Kucing sudah telah dimulakan? Nilai semasa pembolehubah statik catCount = 37 Pembina kelas asas haiwan selesai! Nilai semasa otak = Otak Nilai semasa jantung = Jantung Pembina kelas kucing telah bermula (Pembina Haiwan sudah selesai) Nilai semasa pembolehubah statik catCount = 37 Nilai semasa ekor = Nilai awal ekor dalam kelas Kucing Nilai semasa ekor = Ekor Jadi, sekarang kita dapat melihat dengan jelas susunan permulaan pembolehubah dan panggilan pembina apabila objek baharu dibuat:
- Pembolehubah statik kelas asas (
Animal
) dimulakan. Dalam kes kami, animalCountAnimal
pembolehubah kelas ditetapkan kepada 7700000. -
Pembolehubah statik kelas kanak-kanak (
Cat
) dimulakan.Nota: kami masih berada di dalam
Animal
pembina dan kami telah memaparkan:Pembina kelas asas haiwan sedang berjalan
Adakah pembolehubah kelas Haiwan telah dimulakan?
Nilai semasa haiwan pembolehubah statikCount = 7700000
Nilai semasa otak dalam kelas Haiwan = Nilai awal otak dalam kelas Haiwan
Nilai semasa jantung dalam kelas Haiwan = Nilai awal jantung dalam kelas Haiwan
Mempunyai pembolehubah kelas Kucing sudah telah dimulakan?
Nilai semasa pembolehubah statik catCount = 37 -
Kemudian pembolehubah bukan statik kelas asas dimulakan. Kami secara khusus memberikan mereka nilai awal, yang kemudiannya digantikan dalam pembina. Pembina Haiwan belum selesai, tetapi nilai awal otak dan jantung telah ditetapkan:
Pembina kelas asas haiwan sedang berjalan
Adakah pembolehubah kelas Haiwan telah dimulakan?
Nilai semasa haiwan pembolehubah statikCount = 7700000
Nilai semasa otak dalam kelas Haiwan = Nilai awal otak dalam kelas Haiwan
Nilai semasa jantung dalam kelas Haiwan = Nilai awal jantung dalam kelas Haiwan -
Pembina kelas asas bermula.
Kami telah meyakinkan diri sendiri bahawa langkah ini adalah keempat: dalam tiga langkah pertama pada permulaan pembinaAnimal
, banyak pembolehubah telah diberikan nilai. -
Medan bukan statik kelas anak (
Cat
) dimulakan.
Ini berlaku sebelumCat
pembina mula berjalan.
Apabila ia mula berjalan, pembolehubah ekor sudah mempunyai nilai:Pembina kelas kucing telah bermula (Pembina Haiwan sudah selesai) Nilai semasa pembolehubah statik catCount = 37 Nilai semasa ekor = Nilai awal ekor dalam kelas Cat
-
Pembina
Cat
kelas kanak-kanak dipanggilDan itulah yang membuat objek kelihatan seperti di Jawa!
Saya mesti mengatakan bahawa kami bukan peminat besar pembelajaran hafalan, tetapi yang terbaik adalah menghafal susunan permulaan pembolehubah dan panggilan pembina .
Ini akan meningkatkan pemahaman anda tentang aliran program, dan keadaan objek anda pada bila-bila masa tertentu.
Selain itu, banyak kelas tidak menggunakan warisan. Dalam kes ini, langkah yang berkaitan dengan kelas asas tidak digunakan.
Bacaan lanjut: |
---|
GO TO FULL VERSION