new
ve her şey hazırdır :) Burada yazarken bilgisayarın ve Java makinesinin içinde neler olduğundan bahsedeceğiz, örneğin:
Cat cat = new Cat();
Bundan daha önce bahsetmiştik, ama her ihtimale karşı size hatırlatalım:
- İlk olarak, nesneyi depolamak için bellek tahsis edilir.
- Ardından, Java makinesi nesneye bir referans oluşturur (bizim durumumuzda referans Cat cat'tır).
- Son olarak, değişkenler başlatılır ve yapıcı çağrılır (bu işleme daha ayrıntılı olarak bakacağız).
public class Vehicle {
public static int vehicleCounter = 0;
private String description = "Vehicle";
public Vehicle() {
}
public String getDescription() {
return description;
}
}
public class Truck extends Vehicle {
private static int truckCounter = 0;
private int yearOfManufacture;
private String model;
private int maxSpeed;
public Truck(int yearOfManufacture, String model, int maxSpeed) {
this.yearOfManufacture = yearOfManufacture;
this.model = model;
this.maxSpeed = maxSpeed;
Vehicle.vehicleCounter++;
truckCounter++;
}
}
Sınıf, Truck
yılını, modelini ve maksimum hızını temsil eden alanlara sahip bir kamyon uygulamasıdır. Şimdi böyle bir nesne yaratmak istiyoruz:
public class Main {
public static void main(String[] args) throws IOException {
Truck truck = new Truck(2017, "Scania S 500 4x2", 220);
}
}
Java makinesinde süreç şu şekilde görünecektir:
-
Olan ilk şey, sınıfın statik değişkenlerinin
Vehicle
başlatılmasıdır . Evet, sınıf dedimVehicle
, değilTruck
. Statik değişkenler, yapıcılar çağrılmadan önce başlatılır ve bu, ana sınıfta başlar. Bunu doğrulamaya çalışalım.vehicleCounter
Sınıftaki alanı 10'a eşitliyoruz ve hem yapıcılarda hem deVehicle
yapıcılarda göstermeye çalışıyoruz .Vehicle
Truck
public class Vehicle { public static int vehicleCounter = 10; private String description = "Vehicle"; public Vehicle() { System.out.println(vehicleCounter); } public String getDescription() { return description; } } public class Truck extends Vehicle { private static int truckCount = 0; private int yearOfManufacture; private String model; private int maxSpeed; public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println(vehicleCounter); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCount++; } }
Println deyimini , görüntülendiğinde
Truck
kamyonun alanlarının henüz başlatılmadığından emin olmak için yapıcının en başına koyduk .vehicleCounter
Ve işte sonuç:
10 10
-
Üst sınıfın statik değişkenleri başlatıldıktan sonra, alt sınıfın statik değişkenleri başlatılır. Bizim durumumuzda, bu
truckCounter
sınıfın alanıdırTruck
.Diğer alanlar başlatılmadan önce yapıcının
truckCounter
içindeki değerini görüntülemeye çalışacağımız başka bir deney yapalım :Truck
public class Truck extends Vehicle { private static int truckCounter = 10; private int yearOfManufacture; private String model; private int maxSpeed; public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println(truckCounter); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCounter++; } }
Gördüğünüz gibi, yapıcı başladığında statik değişkenimize 10 değeri zaten atanmıştır
Truck
. -
İnşaatçıların zamanı hala gelmedi! Değişken başlatma devam ediyor. Ana sınıfın statik olmayan değişkenleri üçüncü olarak başlatılır. Gördüğünüz gibi, kalıtım, bir nesne yaratma sürecini önemli ölçüde karmaşıklaştırıyor, ancak bu konuda yapabileceğiniz hiçbir şey yok: Programlamada bazı şeyleri ezberlemeniz yeterli :)
description
Bir deney olarak, sınıftaki değişkene bir başlangıç değeri atayabilirVehicle
ve ardından yapıcıda değiştirebiliriz.public class Vehicle { public static int vehicleCounter = 10; private String description = "Initial value of the description field"; public Vehicle() { System.out.println(description); description = "Vehicle"; System.out.println(description); } public String getDescription() { return description; } }
main()
Bir kamyon oluşturan yöntemimizi çalıştıralım :public class Main { public static void main(String[] args) throws IOException { Truck truck = new Truck(2017, "Scania S 500 4x2", 220); } }
Aşağıdaki sonucu elde ederiz:
Initial value of the description field Vehicle
Vehicle
Bu, yapıcı başladığındadescription
alana zaten bir değer atandığını kanıtlar . -
Son olarak, inşaatçıların zamanı geldi! Daha doğrusu, temel sınıf yapıcısının zamanı geldi. Nesne oluşturma sürecinin dördüncü adımında çağrılır.
Bunu doğrulamak da oldukça kolaydır. Konsola iki satır çıkarmayı deneyelim: biri
Vehicle
temel sınıf yapıcısının içinde, ikincisiTruck
yapıcının içinde.Vehicle
Önce içerideki satırın görüntülendiğine ikna olmamız gerekiyor :public Vehicle() { System.out.println("Hello from the Vehicle constructor!"); } public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println("Hello from the Truck constructor!"); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCounter++; }
Metodumuzu çalıştıracağız
main()
ve sonuca bakacağız:Hello from the Vehicle constructor! Hello from the Truck constructor!
Harika. Demek ki yanılmamışız :) Devam edelim.
-
Şimdi sıra çocuk sınıfın, yani bizim sınıfımızın statik olmayan alanlarının başlatılmasına
Truck
geldi . Başlatılmakta olan sınıfın hemen içindeki alanlar, beşinci adıma kadar başlatılmaz! Şaşırtıcı, ama doğru :) Yine, basit bir kontrol yapacağız — tıpkı üst sınıfta olduğu gibi: değişkene bir miktar başlangıç değeri vereceğizmaxSpeed
ve yapıcıda,Truck
değerin yapıcı başlamadan önce atandığını kontrol edeceğiz:public class Truck extends Vehicle { private static int truckCounter = 10; private int yearOfManufacture; private String model; private int maxSpeed = 150; public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println("Initial value of maxSpeed = " + this.maxSpeed); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCounter++; } }
Konsol çıktısı:
Initial value of maxSpeed = 150
Gördüğünüz gibi, yapıcı başladığında zaten 150'ye eşittir!
Truck
maxSpeed
-
Alt sınıfın yapıcısı
Truck
çağrılır.Ve ancak bu noktada, son olarak, somutlaştırdığımız sınıfın yapıcısı çağrılacak!
Sadece altıncı adımda, kamyonumuza argüman olarak ilettiğimiz değerler alanlara atanacaktır.
Gördüğünüz gibi, bir kamyonu "inşa etmek", yani nesne yaratma süreci basit değildir. Ama öyle görünüyor ki en küçük parçalara ayırdık :)
GO TO FULL VERSION