JavaRush /Blog Java /Random-MS /Pembina kelas asas

Pembina kelas asas

Diterbitkan dalam kumpulan
hello! Kali terakhir kami bercakap tentang pembina , dan kami belajar banyak tentang mereka. Sekarang kita akan bercakap tentang perkara seperti pembina kelas asas. Apakah kelas asas ? Faktanya ialah di Jawa, beberapa kelas yang berbeza boleh mempunyai asal yang sama. Pembina kelas asas - 2Ini dipanggil warisan . Beberapa kelas keturunan boleh mempunyai satu kelas nenek moyang yang sama. Sebagai contoh, bayangkan bahawa kita mempunyai kelas Animal(haiwan):
public class Animal {

   String name;
   int age;
}
Kita boleh mencipta untuknya, sebagai contoh, 2 kelas keturunan - Catdan 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, Catpembina kelas akan berfungsi terlebih dahulu Animal, dan hanya kemudian pembina Cat. Untuk memastikan ini, mari tambahkan pada pembina Catdan Animaloutput 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 braindalam heartkelas induk Animaldan medan taildalam 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 Cattidak mempunyai medan braindan heart. Medan ini "ditarik" daripada kelas asas Animal. Kelas keturunan mempunyai akses kepada medan kelas asas, jadi Catmereka boleh dilihat dalam kelas kami. Oleh itu, kita tidak perlu Catmenduplikasi 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, Catkami memanggil pembina Animaldan lulus dua medan kepadanya. Kami hanya perlu memulakan secara eksplisit satu medan - tailyang Animaltidak 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 - Animaldan 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 Animalmempunyai pembolehubah sendiri, dan kelas keturunan Catmempunyai sendiri. Mari tambah satu pembolehubah statik ke kelas untuk Animalkejelasan . CatPembolehubah animalCountkelas Animalialah jumlah bilangan spesies haiwan di bumi, dan pembolehubah catsCountialah 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 Catyang 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:
  1. Pembolehubah statik kelas asas ( ) dimulakan Animal. Dalam kes kami, pembolehubah animalCountkelas Animaldiberikan nilai 7700000.

  2. Pembolehubah statik kelas keturunan ( ) dimulakan Cat. Beri perhatian - kami masih berada di dalam constructor Animal, 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
  3. Seterusnya, pembolehubah bukan statik kelas asas dimulakan . Kami secara khusus memberikan mereka nilai awal, yang kemudiannya ditukar kepada yang baharu dalam pembina. Pembina Animalbelum menyelesaikan kerjanya, tetapi nilai awal braintelah heartdiberikan:

    
        Выполняется конструктор базового класса Animal
        Были ли уже проинициализированы переменные класса Animal?
        Текущее meaning статической переменной animalCount = 7700000
        Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
        Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
  4. Pembina kelas asas mula berfungsi .

    Kami telah melihat bahawa peringkat ini hanyalah peringkat keempat: dalam tiga mata pertama, pada masa pembina mula berfungsi, Animalbanyak pembolehubah telah diberikan nilai.

  5. Memulakan medan bukan statik bagi kelas kanak-kanak ( Cat).

    Ia berlaku sebelum pereka bentuk Catmula bekerja.

    Pada masa dia mula bekerja, pembolehubah tailsudah mempunyai nilai:

    
    Конструктор класса Cat начал работу (конструктор Animal уже был выполнен)
    Текущее meaning статической переменной catsCount = 37
    Текущее meaning tail = Изначальное meaning tail в классе Cat
  6. Pembina kelas keturunan dipanggil Cat

Beginilah rupa proses mencipta objek di Jawa! Saya mesti mengatakan bahawa kita bukan peminat besar cramming, tetapi lebih baik untuk menghafal urutan permulaan pembolehubah dan memanggil pembina dan mengingatinya untuk masa depan . Ini akan meningkatkan pemahaman anda tentang kemajuan program dan keadaan objek anda pada bila-bila masa tertentu. Selain itu, kelas selalunya tidak mempunyai kelas induk langsung (kelas super/kelas asas). Dalam kes ini, item yang dikaitkan dengan kelas asas tidak akan dilaksanakan.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION