CodeGym/Java Blog/Acak/Konstruktor kelas dasar
John Squirrels
Level 41
San Francisco

Konstruktor kelas dasar

Dipublikasikan di grup Acak
anggota
Hai! Terakhir kali kami berbicara tentang konstruktor dan belajar banyak tentang mereka. Sekarang kita akan berbicara tentang konstruktor kelas dasar .
Konstruktor kelas dasar - 1
Apa itu kelas dasar ? Ini berkaitan dengan fakta bahwa di Jawa beberapa kelas yang berbeda dapat memiliki asal yang sama.
Konstruktor kelas dasar - 2
Ini disebut warisan . Beberapa kelas anak dapat memiliki satu nenek moyang yang sama. Misalnya, bayangkan kita memiliki Animalkelas:
public class Animal {

   String name;
   int age;
}
Kita dapat mendeklarasikan 2 kelas anak: Catdan Dog. Ini dilakukan dengan menggunakan kata kunci extends .
public class Cat extends Animal {

}

public class Dog extends Animal {

}
Kami mungkin menganggap ini berguna di masa mendatang. Misalnya, jika ada tugas menangkap tikus, kita akan membuat Cat objek di program kita. Jika tugasnya mengejar tongkat, maka kita akan menggunakan objek Dog . Dan jika kita membuat program yang mensimulasikan klinik hewan, itu akan bekerja dengan Animal kelas (dan dengan demikian dapat merawat kucing dan anjing). Sangat penting untuk diingat bahwa ketika sebuah objek dibuat, konstruktor kelas dasarnya pertama kali dipanggil . Hanya setelah konstruktor selesai barulah program mengeksekusi konstruktor kelas yang sesuai dengan objek yang kita buat. Dengan kata lain, saat membuat Catobjek, konstruktor Animaldijalankan terlebih dahulu , baru setelah ituCatkonstruktor dieksekusi . Untuk melihatnya, tambahkan beberapa keluaran konsol ke konstruktor Catdan Animal.
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: Konstruktor hewan dieksekusi Konstruktor Cat dieksekusi! Memang, itu bekerja seperti itu! Mengapa? Salah satu alasannya adalah untuk menghindari duplikasi bidang yang dibagi antara dua kelas. Misalnya, setiap hewan memiliki hati dan otak, tetapi tidak setiap hewan memiliki ekor. Kita dapat mendeklarasikan bidang otak dan jantung , yang umum untuk semua hewan, di Animalkelas induk, dan bidang ekor di Catsubkelas. . Sekarang kita akan mendeklarasikan Catkonstruktor kelas yang mengambil argumen untuk ketiga bidang.
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");
   }
}
Catatan: Konstruktor berfungsi dengan baik meskipun kelas Cattidak memiliki bidang otak dan hati . Bidang ini "diwarisi" dari Animalkelas dasar. Kelas pewaris memiliki akses ke bidang kelas dasar , sehingga terlihat di Catkelas kita. Akibatnya, kita tidak perlu menduplikasi bidang ini di Catkelas. Kita bisa mengambilnya dari Animalkelas. Terlebih lagi, kita dapat secara eksplisit memanggil konstruktor kelas dasar di konstruktor kelas anak. Kelas dasar juga disebut " superclass ". Itu sebabnya Java menggunakan kata kunci super untuk menunjukkan kelas dasar. 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 di kelas induk kami. Kita sebenarnya tidak harus melakukan ini. Cukup memanggil konstruktor kelas induk dan memberikan argumen 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 Catkonstruktor, kami memanggil Animalkonstruktor dan melewati dua bidang. Kami hanya memiliki satu bidang untuk diinisialisasi secara eksplisit: tail , yang tidak ada di Animal. Ingat kami menyebutkan bahwa konstruktor kelas induk dipanggil pertama kali saat objek dibuat? Itu sebabnya super() harus selalu menjadi yang pertama dalam sebuah konstruktor! Jika tidak, logika konstruktor akan dilanggar 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 tahu bahwa ketika objek dari kelas anak dibuat, konstruktor kelas dasar dipanggil terlebih dahulu. Dan jika Anda mencoba mengubah perilaku ini secara manual, kompiler tidak akan mengizinkannya.

Bagaimana sebuah objek dibuat

Kami sebelumnya melihat contoh dengan basis dan kelas induk: Animaldan Cat. Dengan menggunakan kedua kelas ini sebagai contoh, sekarang kita akan melihat proses pembuatan objek dan menginisialisasi variabel. Kita tahu bahwa ada variabel statis dan instan (non-statis) . Kita juga tahu bahwa Animalkelas dasar memiliki variabel, dan Catkelas anak memiliki variabelnya sendiri. Untuk kejelasan, kami akan menambahkan masing-masing satu variabel statis ke kelas Animaland Cat. Variabel animalCount di kelas akan mewakili jumlah total spesies hewan di Bumi, dan catCountAnimalvariabel akan menandakan jumlah spesies kucing. Selain itu, kami akan menetapkan nilai awal untuk semua variabel non-statis di kedua kelas (yang kemudian akan diubah di konstruktor).
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");
   }
}
Jadi kami membuat instance baru dari Catkelas, yang mewarisi Animal. Kami telah menambahkan beberapa keluaran konsol terperinci untuk melihat apa yang terjadi dan dalam urutan apa. Inilah yang akan ditampilkan saat Catobjek dibuat: Konstruktor kelas dasar hewan sedang berjalan Apakah variabel kelas Hewan sudah diinisialisasi? Nilai arus variabel statis animalCount = 7700000 Nilai arus otak kelas Hewan = Nilai awal otak kelas Hewan Nilai arus jantung kelas Hewan = Nilai awal jantung kelas Hewan Sudah memiliki variabel kelas Kucing diinisialisasi? Nilai saat ini dari variabel statis catCount = 37 Konstruktor kelas dasar hewan selesai! Nilai saat ini dari brain = Brain Nilai saat ini heart = Heart Konstruktor kelas kucing telah dimulai (Konstruktor Hewan telah selesai) Nilai saat ini dari variabel statis catCount = 37 Nilai saat ini dari tail = Nilai awal dari tail di kelas Cat Nilai saat ini dari tail = Ekor Jadi, sekarang kita dapat melihat dengan jelas urutan inisialisasi variabel dan panggilan konstruktor saat objek baru dibuat:
  1. Variabel statis dari kelas dasar ( Animal) diinisialisasi. Dalam kasus kita, Animalvariabel kelas animalCount diatur ke 7700000.

  2. Variabel statis kelas anak ( Cat) diinisialisasi.

    Catatan: kita masih di dalam Animalkonstruktor dan sudah ditampilkan:

    Konstruktor kelas dasar hewan sedang berjalan
    Apakah variabel kelas Hewan sudah diinisialisasi?
    Nilai arus variabel statik animalCount = 7700000
    Nilai arus otak pada kelas Animal = Nilai awal otak pada kelas Animal
    Nilai arus jantung pada kelas Animal = Nilai awal jantung pada kelas Animal
    Sudah memiliki variabel kelas Cat diinisialisasi?
    Nilai saat ini dari variabel statis catCount = 37


  3. Kemudian variabel non-statis dari kelas dasar diinisialisasi. Kami secara khusus memberi mereka nilai awal, yang kemudian diganti di konstruktor. Konstruktor Hewan belum selesai, tetapi nilai awal otak dan hati telah ditetapkan:

    Konstruktor kelas dasar hewan sedang berjalan
    Apakah variabel kelas Hewan sudah diinisialisasi?
    Nilai Arus Variabel Statis AnimalCount = 7700000
    Nilai Arus Otak pada Kelas Hewan = Nilai Awal Otak pada Kelas Hewan
    Nilai Arus Jantung pada Kelas Hewan = Nilai Awal Jantung pada Kelas Hewan


  4. Konstruktor kelas dasar dimulai.
    Kami telah meyakinkan diri kami sendiri bahwa langkah ini keempat: dalam tiga langkah pertama di awal konstruktor Animal, banyak variabel telah diberi nilai.


  5. Bidang non-statis dari kelas anak ( Cat) diinisialisasi.
    Ini terjadi sebelum Catkonstruktor mulai berjalan.
    Saat mulai berjalan, variabel ekor sudah memiliki nilai:

    Konstruktor kelas kucing telah dimulai (Konstruktor Hewan telah selesai) Nilai variabel statis saat ini catCount = 37 Nilai saat ini dari ekor = Nilai awal dari ekor di kelas Cat


  6. Konstruktor Catkelas anak dipanggil

    Dan seperti itulah pembuatan objek di Java!

    Saya harus mengatakan bahwa kami bukan penggemar hafalan, tetapi yang terbaik adalah menghafal urutan inisialisasi variabel dan panggilan konstruktor .

    Ini akan sangat meningkatkan pemahaman Anda tentang alur program, dan keadaan objek Anda pada saat tertentu.

    Selain itu, banyak kelas tidak menggunakan warisan. Dalam hal ini, langkah-langkah yang terkait dengan kelas dasar tidak berlaku.

Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar