CodeGym /Java Blogu /Rastgele /Temel sınıf oluşturucuları
John Squirrels
Seviye
San Francisco

Temel sınıf oluşturucuları

grupta yayınlandı
MERHABA! Geçen sefer inşaatçılar hakkında konuştuk ve onlar hakkında çok şey öğrendik. Şimdi temel sınıf kurucularından bahsedeceğiz .
Temel sınıf kurucuları - 1
Temel sınıf nedir ? Java'da birkaç farklı sınıfın ortak bir kökene sahip olabileceği gerçeğiyle ilgisi var.
Temel sınıf kurucuları - 2
Buna miras denir . Birkaç alt sınıfın ortak bir atası olabilir. Örneğin, bir sınıfımız olduğunu hayal edin Animal:

public class Animal {
  
   String name;
   int age;
}
2 alt sınıf ilan edebiliriz: Catve Dog. Bu, extends anahtar sözcüğü kullanılarak yapılır .

public class Cat extends Animal {

}

public class Dog extends Animal {
  
}
Bunu gelecekte yararlı bulabiliriz. Örneğin fare yakalama görevi varsa Cat programımızda bir nesne oluşturacağız. Görev bir sopanın peşinden koşmaksa, o zaman bir Dog nesne kullanırız. Ve bir veteriner kliniğini simüle eden bir program oluşturursak, sınıfla birlikte çalışır Animal (ve böylece hem kedileri hem de köpekleri tedavi edebilir). Bir nesne oluşturulduğunda, ilk olarak onun temel sınıfının kurucusunun çağrıldığını hatırlamak çok önemlidir . Ancak bu yapıcı tamamlandıktan sonra program, oluşturduğumuz nesneye karşılık gelen sınıfın yapıcısını çalıştırır. CatBaşka bir deyişle, bir nesne oluşturulurken , önce yapıcı Animalçalıştırılır ve ancak ondan sonra çalıştırılır.Catyapıcı yürütüldü . CatBunu görmek için, ve yapıcılara bazı konsol çıktıları ekleyin 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();
   }
}
Konsol çıktısı: Hayvan oluşturucu yürütüldü Cat oluşturucu yürütüldü! Gerçekten de, bu şekilde çalışıyor! Neden? Bunun bir nedeni, iki sınıf arasında paylaşılan alanları çoğaltmaktan kaçınmaktır. Örneğin her hayvanın kalbi ve beyni vardır ama her hayvanın kuyruğu yoktur. Ebeveyn sınıfında tüm hayvanlarda ortak olan beyin ve kalpAnimal alanlarını ve alt sınıfta kuyruk alanını ilan edebiliriz Cat. . CatŞimdi , 3 alan için de argüman alan bir sınıf oluşturucu ilan edeceğiz .

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");
   }
}
Not: Kurucu, sınıfın beyin ve kalp alanları olmamasına rağmen düzgün Catçalışıyor . Bu alanlar temel sınıftan "miras alınır" Animal. Miras alan sınıf, temel sınıfın alanlarına erişebilir , bu nedenle sınıfımızda görünürler Cat. Sonuç olarak, sınıfta bu alanları çoğaltmamız gerekmiyor Cat. Onları sınıftan alabiliriz Animal. Dahası, alt sınıf yapıcısında temel sınıf yapıcısını açıkça çağırabiliriz. Bir temel sınıf aynı zamanda " süper sınıf " olarak da adlandırılır . Bu nedenle Java, temel sınıfı belirtmek için super anahtar sözcüğünü kullanır. Önceki örnekte

public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }
Ebeveyn sınıfımızdaki her alanı ayrı ayrı atadık. Aslında bunu yapmak zorunda değiliz. Üst sınıf yapıcısını çağırmak ve gerekli argümanları iletmek yeterlidir:

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");
   }
}
Yapıcıda Cat, yapıcıyı çağırdık Animalve iki alanı geçtik. Açıkça başlatmak için tek bir alanımız vardı: tail içinde olmayan Animal. Bir nesne oluşturulduğunda ilk olarak üst sınıf kurucusunun çağrıldığından bahsettiğimizi hatırlıyor musunuz? Bu yüzden super() bir yapıcıda her zaman ilk sırada olmalıdır! Aksi halde yapıcı mantığı bozulur ve program hata verir.

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");
   }
}
Derleyici, bir alt sınıfın nesnesi oluşturulduğunda, önce temel sınıf yapıcısının çağrıldığını bilir. Ve bu davranışı manuel olarak değiştirmeye çalışırsanız, derleyici buna izin vermez.

Bir nesne nasıl oluşturulur?

Daha önce bir temel ve üst sınıfa sahip bir örneğe baktık: Animalve Cat. Bu iki sınıfı örnek olarak kullanarak, şimdi bir nesne yaratma ve değişkenleri başlatma sürecine bakacağız. Statik ve örnek (statik olmayan) değişkenler olduğunu biliyoruz . AnimalAyrıca temel sınıfın değişkenleri olduğunu ve Catalt sınıfın da kendi değişkenleri olduğunu biliyoruz . AnimalAnlaşılır olması için, ve sınıflarının her birine birer statik değişken ekleyeceğiz Cat. Sınıftaki animalCount değişkeni, Dünya'daki toplam hayvan türü sayısını ve catCount'u temsil edecektir .Animaldeğişkeni kedi türü sayısını ifade edecektir. Ek olarak, her iki sınıftaki tüm statik olmayan değişkenlere başlangıç ​​değerleri atayacağız (bu değerler daha sonra yapıcıda değiştirilecektir).

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");
   }
}
CatNET'i miras alan sınıfın yeni bir örneğini yaratıyoruz Animal. Neler olduğunu ve hangi sırayla olduğunu görmek için bazı ayrıntılı konsol çıktıları ekledik. CatBir nesne oluşturulduğunda görüntülenecek olan budur :Animal temel sınıf yapıcısı çalışıyor Animal sınıfının değişkenleri zaten başlatıldı mı? AnimalCount statik değişkeninin geçerli değeri = 7700000 Animal sınıfında Brain'in geçerli değeri = Animal sınıfında Brain'in başlangıç ​​değeri Animal sınıfında Heart'ın geçerli değeri = Animal sınıfında Heart'ın başlangıç ​​değeri Cat sınıfının değişkenlerine zaten sahip olun başlatıldı mı? catCount statik değişkeninin geçerli değeri = 37 Hayvan temel sınıf yapıcısı tamamlandı! Brain'in mevcut değeri = Brain Mevcut değer Heart = Heart cat sınıfı kurucusu başladı (Animal kurucusu zaten bitti) catCount statik değişkeninin mevcut değeri = 37 tail'in mevcut değeri = Cat sınıfındaki tail'in başlangıç ​​değeri tail'in mevcut değeri = Kuyruk Böylece, artık yeni bir nesne oluşturulduğunda değişken başlatma ve yapıcı çağrılarının sırasını açıkça görebiliriz:
  1. Temel sınıfın ( ) statik değişkenleri Animalbaşlatılır. Bizim durumumuzda, Animalsınıfın animalCount değişkeni 7700000 olarak ayarlanmıştır.

  2. Alt sınıfın ( ) statik değişkenleri Catbaşlatılır.

    Not: Hala yapıcının içindeyiz Animalve zaten şunu gösterdik:

    Animal temel sınıf yapıcısı çalışıyor
    Animal sınıfının değişkenleri zaten başlatıldı mı?
    AnimalCount statik değişkeninin geçerli değeri = 7700000
    Animal sınıfında Brain'in geçerli değeri = Animal sınıfında Brain'in başlangıç ​​değeri Animal sınıfında
    Heart'ın geçerli değeri = Animal sınıfında Heart'ın başlangıç ​​değeri
    Cat sınıfının değişkenlerine zaten sahip olun başlatıldı mı?
    catCount statik değişkeninin geçerli değeri = 37


  3. Daha sonra temel sınıfın statik olmayan değişkenleri başlatılır. Onlara, daha sonra yapıcıda değiştirilen ilk değerleri özel olarak atadık. Animal yapıcısı henüz bitmedi, ancak beyin ve kalbin başlangıç ​​değerleri zaten atandı:

    Animal temel sınıf yapıcısı çalışıyor
    Animal sınıfının değişkenleri zaten başlatıldı mı?
    AnimalCount statik değişkeninin geçerli değeri = 7700000
    Animal sınıfında Brain'in geçerli değeri = Animal sınıfında Brain'in başlangıç ​​değeri Animal sınıfında
    Heart'ın geçerli değeri = Animal sınıfında Heart'ın başlangıç ​​değeri


  4. Temel sınıf yapıcısı başlar.
    Bu adımın dördüncü adım olduğuna kendimizi zaten ikna ettik: yapıcının başlangıcındaki ilk üç adımda Animal, birçok değişkene zaten değerler atanmıştır.


  5. Alt sınıfın ( ) statik olmayan alanları Catbaşlatılır. Bu, yapıcı çalışmaya başlamadan
    önce gerçekleşir . Çalışmaya başladığında, kuyruk değişkeninin zaten bir değeri vardır:Cat

    cat sınıfı kurucusu başladı (Animal kurucusu zaten bitti) catCount statik değişkeninin mevcut değeri = 37 tail'in mevcut değeri = Cat sınıfındaki tail'in başlangıç ​​değeri


  6. Alt sınıfın yapıcısına Catdenir

    Ve Java'da bir nesne yaratmak böyle görünür!

    Ezberci öğrenmenin büyük hayranları olmadığımızı söylemeliyim, ancak değişken başlatma ve yapıcı çağrılarının sırasını ezberlemek en iyisidir .

    Bu, programın akışı ve nesnelerinizin herhangi bir andaki durumu hakkındaki anlayışınızı büyük ölçüde artıracaktır.

    Ayrıca, birçok sınıf kalıtımı kullanmaz. Bu durumda, temel sınıfla ilgili adımlar geçerli değildir.

Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION