JavaRush /Java Blog /Random-ID /Konstruktor kelas dasar

Konstruktor kelas dasar

Dipublikasikan di grup Random-ID
Halo! Terakhir kali kita berbicara tentang konstruktor , dan kita belajar banyak tentangnya. Sekarang kita akan membicarakan tentang konstruktor kelas dasar. Apa itu kelas dasar ? Faktanya adalah bahwa di Java, beberapa kelas berbeda mungkin memiliki asal usul yang sama. Konstruktor kelas dasar - 2Ini disebut warisan . Beberapa kelas turunan dapat memiliki satu kelas nenek moyang yang sama. Misalnya, bayangkan kita mempunyai kelas Animal(hewan):
public class Animal {

   String name;
   int age;
}
Kita dapat membuatnya, misalnya, 2 kelas turunan - Catdan 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, Catkonstruktor kelas akan bekerja terlebih dahulu Animal, baru kemudian konstruktor Cat. Untuk memastikan hal ini, mari tambahkan konstruktor Catdan Animalkeluaran 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 braindi heartkelas induk Animal, dan sebuah field taildi 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 Cattidak memiliki bidang braindan heart. Bidang-bidang ini “ditarik” dari kelas dasar Animal. Kelas turunan memiliki akses ke bidang kelas dasar, sehingga Catbidang tersebut terlihat di kelas kita. Oleh karena itu, kita tidak perlu Catmenduplikasi 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, Catkami memanggil konstruktor Animaldan meneruskan dua bidang ke dalamnya. Kita hanya perlu menginisialisasi satu bidang secara eksplisit - tailyang Animaltidak 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 - Animaldan 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 Animalmempunyai variabelnya sendiri, dan kelas turunannya Catmempunyai variabelnya sendiri. Mari tambahkan satu variabel statis ke kelas untuk Animalkejelasan . CatVariabel animalCountkelasnya Animaladalah jumlah total spesies hewan di bumi, dan variabelnya catsCountadalah 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 Catyang 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:
  1. Variabel statis kelas dasar ( ) diinisialisasi Animal. Dalam kasus kami, variabel animalCountkelas Animaldiberi nilai 7700000.

  2. Variabel statis dari kelas turunan ( ) diinisialisasi Cat. Perhatikan - kita masih berada di dalam konstruktor Animal, 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
  3. 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 Animalbelum menyelesaikan pekerjaannya, tetapi nilai awal braintelah heartditetapkan:

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

    Kita telah melihat bahwa tahap ini hanyalah tahap keempat: dalam tiga poin pertama, pada saat konstruktor mulai bekerja, Animalbanyak variabel telah diberi nilai.

  5. Menginisialisasi bidang non-statis dari kelas anak ( Cat).

    Itu terjadi sebelum desainer Catmulai bekerja.

    Pada saat dia mulai bekerja, variabel tersebut tailsudah memiliki nilai:

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

Seperti inilah proses pembuatan objek di Java! Saya harus mengatakan bahwa kami bukan penggemar berat menjejalkan, tetapi lebih baik menghafal urutan inisialisasi variabel dan memanggil konstruktor serta mengingatnya untuk masa depan . Ini akan sangat meningkatkan pemahaman Anda tentang kemajuan program dan keadaan objek Anda pada saat tertentu. Selain itu, kelas sering kali tidak memiliki kelas induk langsung (kelas super/kelas dasar). Dalam hal ini, item yang terkait dengan kelas dasar tidak akan dieksekusi.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION