Hai! Kali terakhir kami bercakap tentang pembina dan belajar banyak tentang mereka. Sekarang kita akan bercakap tentang pembina kelas asas .
Pembina kelas asas - 1
Apakah kelas asas ? Ia mempunyai kaitan dengan fakta bahawa di Jawa beberapa kelas yang berbeza boleh mempunyai asal yang sama.
Pembina kelas asas - 2
Ini dipanggil warisan . Beberapa kelas kanak-kanak boleh mempunyai satu nenek moyang yang sama. Sebagai contoh, bayangkan bahawa kita mempunyai Animalkelas:

public class Animal {
  
   String name;
   int age;
}
Kami boleh mengisytiharkan 2 kelas kanak-kanak: Catdan 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 Catobjek, pembina Animaldijalankan dahulu , dan hanya selepas ituCatpembina dilaksanakan . Untuk melihat ini, tambahkan beberapa output konsol pada Catdan Animalpembina.

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 Animalkelas induk, dan medan ekor dalam Catsubkelas. . Sekarang kita akan mengisytiharkan Catpembina 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 Cattidak mempunyai medan otak dan jantung . Medan ini "diwarisi" daripada Animalkelas asas. Kelas pewarisan mempunyai akses kepada medan kelas asas , jadi mereka boleh dilihat dalam Catkelas kami. Akibatnya, kita tidak perlu menduplikasi medan ini dalam Catkelas. Kita boleh ambil mereka dari Animalkelas. 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 Catpembina, kami memanggil Animalpembina 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: Animaldan 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 Animalkelas asas mempunyai pembolehubah, dan Catkelas kanak-kanak mempunyai kelasnya sendiri. Untuk kejelasan, kami akan menambah satu pembolehubah statik setiap satu pada Animaldan Catkelas. Pembolehubah animalCount dalam Animalkelas 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 Catobjek 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:
  1. Pembolehubah statik kelas asas ( Animal) dimulakan. Dalam kes kami, animalCountAnimal pembolehubah kelas ditetapkan kepada 7700000.

  2. Pembolehubah statik kelas kanak-kanak ( Cat) dimulakan.

    Nota: kami masih berada di dalam Animalpembina 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


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


  4. Pembina kelas asas bermula.
    Kami telah meyakinkan diri sendiri bahawa langkah ini adalah keempat: dalam tiga langkah pertama pada permulaan pembina Animal, banyak pembolehubah telah diberikan nilai.


  5. Medan bukan statik kelas anak ( Cat) dimulakan.
    Ini berlaku sebelum Catpembina 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


  6. Pembina Catkelas kanak-kanak dipanggil

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