

Animal
:
public class Animal {
String name;
int age;
}
2 alt sınıf ilan edebiliriz: Cat
ve 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. Cat
Baş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.Cat
yapıcı yürütüldü . Cat
Bunu 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 Animal
ve 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:Animal
ve 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 . Animal
Ayrıca temel sınıfın değişkenleri olduğunu ve Cat
alt sınıfın da kendi değişkenleri olduğunu biliyoruz . Animal
Anlaşı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 .Animal
değ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");
}
}
Cat
NET'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. Cat
Bir 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:
- Temel sınıfın ( ) statik değişkenleri
Animal
başlatılır. Bizim durumumuzda,Animal
sınıfın animalCount değişkeni 7700000 olarak ayarlanmıştır. -
Alt sınıfın ( ) statik değişkenleri
Cat
başlatılır.Not: Hala yapıcının içindeyiz
Animal
ve 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 -
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 -
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ımdaAnimal
, birçok değişkene zaten değerler atanmıştır. -
Alt sınıfın ( ) statik olmayan alanları
Cat
baş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
-
Alt sınıfın yapıcısına
Cat
denirVe 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.
Daha fazla okuma: |
---|
GO TO FULL VERSION