CodeGym /Java Blogu /Rastgele /Nesne oluşturma sırasındaki eylemlerin sırası
John Squirrels
Seviye
San Francisco

Nesne oluşturma sırasındaki eylemlerin sırası

grupta yayınlandı
MERHABA! Bugünün dersi oldukça... ah... çok yönlü :) olacak, yani çok çeşitli konuları ele alacağız, ama hepsi nesne yaratma süreciyle ilgili olacak . Nesne oluşturma sırasındaki eylemlerin sırası - 1Baştan sona analiz edeceğiz: kurucular nasıl çağrılır, alanlar (statik alanlar dahil) nasıl ve hangi sırayla başlatılır, vb. Makalede tartışılan bazı noktalara daha önce değindik, böylece göz atabilirsiniz. temel sınıf oluşturuculardaki malzeme . Öncelikle bir nesnenin nasıl yaratıldığını hatırlayalım. Bu sürecin bir geliştiricinin bakış açısından nasıl göründüğünü çok iyi hatırlarsınız: bir sınıf oluşturur, yazar newve 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).
Ek olarak, nesne yaşam döngüsüyle ilgili dersten muhtemelen bir nesnenin ona en az bir referans olduğu sürece var olduğunu hatırlarsınız. Hiçbiri kalmadıysa, nesne çöp toplayıcının avı olur. Nesne oluşturma sırasındaki eylemlerin sırası - 2Bu ilk iki nokta herhangi bir özel soruyu gündeme getirmemelidir. Bellek tahsisi basit bir işlemdir ve yalnızca iki olası sonuç vardır: bellek vardır veya yoktur :) Ve bir bağlantı oluşturmak alışılmadık bir durum değildir. Ancak üçüncü nokta, katı bir sırayla yürütülen tüm bir dizi işlemi temsil eder. Sınavlara hazırlanma taraftarı değilim ama bu süreci iyi anlamanız ve bu işlem sırasını ezberlemeniz gerekiyor.. Önceki derslerde nesne oluşturma sürecinden bahsettiğimizde, kalıtım hakkında henüz hiçbir şey bilmiyordunuz, bu nedenle bazı şeyleri açıklamak sorunluydu. Artık oldukça fazla şey biliyorsunuz ve sonunda bu soruyu tam olarak ele alabiliriz :) Yani üçüncü nokta " Sonunda, değişkenler başlatılır ve yapıcı çağrılır " der. Peki tüm bunlar hangi sırayla gerçekleşir? Daha iyi anlamak için iki süper basit sınıf oluşturalım - bir ebeveyn ve bir çocuk:

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, Truckyı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:
  1. Olan ilk şey, sınıfın statik değişkenlerinin Vehiclebaşlatılmasıdır . Evet, sınıf dedim Vehicle, değil Truck. 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. vehicleCounterSınıftaki alanı 10'a eşitliyoruz ve hem yapıcılarda hem de Vehicleyapıcılarda göstermeye çalışıyoruz .VehicleTruck

    
    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 Truckkamyonun 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
    
  2. Ü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 truckCountersınıfın alanıdır Truck.

    Diğer alanlar başlatılmadan önce yapıcının truckCounteriç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ırTruck .

  3. İ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 :)

    descriptionBir deney olarak, sınıftaki değişkene bir başlangıç ​​değeri atayabilir Vehicleve 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
    

    VehicleBu, yapıcı başladığında descriptionalana zaten bir değer atandığını kanıtlar .

  4. 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 Vehicletemel sınıf yapıcısının içinde, ikincisi Truckyapı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.

  5. Şimdi sıra çocuk sınıfın, yani bizim sınıfımızın statik olmayan alanlarının başlatılmasınaTruck 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ğiz maxSpeedve yapıcıda, Truckdeğ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!TruckmaxSpeed

  6. 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 :)

Nesne oluşturma sırasındaki eylemlerin sırası - 3 Bu süreci iyi anlamak neden bu kadar önemli? "Kaputun altında" tam olarak ne olduğunu bilmiyorsanız, sıradan bir nesne yaratmanın sonuçlarının ne kadar beklenmedik olabileceğini bir düşünün :) Şimdi kursa dönme ve bazı görevleri tamamlama zamanı! İyi şanslar ve yakında görüşürüz! :)
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION