CodeGym /Java Blog /Acak /Urutan tindakan selama pembuatan objek
John Squirrels
Level 41
San Francisco

Urutan tindakan selama pembuatan objek

Dipublikasikan di grup Acak
Hai! Pelajaran hari ini akan cukup... eh... multifaset :) dalam artian kita akan membahas berbagai macam topik, tapi semuanya akan berhubungan dengan proses pembuatan objek . Urutan tindakan selama pembuatan objek - 1Kami akan menganalisisnya dari awal hingga akhir: bagaimana konstruktor dipanggil, bagaimana dan dalam urutan apa bidang (termasuk bidang statis) diinisialisasi, dll. Kami sebelumnya telah menyentuh beberapa poin yang dibahas dalam artikel, sehingga Anda dapat melihat sekilas materi pada konstruktor kelas dasar . Pertama, mari kita ingat bagaimana sebuah objek dibuat. Anda ingat dengan baik bagaimana proses ini terlihat dari sudut pandang pengembang: dia membuat kelas, menulis new, dan semuanya sudah siap :) Di sini kita akan berbicara tentang apa yang terjadi di dalam komputer dan mesin Java saat kita menulis, misalnya:

Cat cat = new Cat();
Kami telah membicarakan hal ini sebelumnya, tetapi untuk berjaga-jaga kami akan mengingatkan Anda:
  • Pertama, memori untuk menyimpan objek dialokasikan.
  • Selanjutnya, mesin Java membuat referensi ke objek (dalam kasus kami, referensinya adalah Cat cat).
  • Terakhir, variabel diinisialisasi dan konstruktor dipanggil (kita akan melihat proses ini lebih detail).
Selain itu, dari pelajaran tentang siklus hidup objek , Anda mungkin ingat bahwa suatu objek bertahan selama setidaknya ada satu referensi untuk itu. Jika tidak ada yang tersisa, maka benda tersebut menjadi mangsa pemulung. Urutan tindakan selama pembuatan objek - 2Dua poin pertama ini seharusnya tidak menimbulkan pertanyaan khusus. Alokasi memori adalah proses yang sederhana, dan hanya ada dua kemungkinan hasil: apakah ada memori atau tidak :) Dan membuat tautan bukanlah hal yang aneh. Tetapi poin ketiga mewakili keseluruhan rangkaian operasi yang dijalankan dalam urutan yang ketat. Saya bukan penggemar menjejalkan tes, tetapi Anda perlu memahami proses ini dengan baik dan Anda perlu mengingat urutan operasi ini. Ketika kita berbicara tentang proses pembuatan objek di pelajaran sebelumnya, Anda belum benar-benar tahu apa-apa tentang pewarisan, jadi menjelaskan beberapa hal itu bermasalah. Sekarang Anda tahu cukup banyak dan akhirnya kami dapat mempertimbangkan pertanyaan ini secara lengkap :) Jadi poin ketiga mengatakan " Akhirnya, variabel diinisialisasi dan konstruktor dipanggil. " Tapi dalam urutan apa semua ini terjadi? Untuk pemahaman yang lebih baik, mari buat dua kelas super sederhana — induk dan anak:

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++; 
   } 
}
Kelas Truckadalah implementasi truk dengan bidang yang mewakili tahun, model, dan kecepatan maksimumnya. Sekarang kami ingin membuat satu objek seperti itu:

public class Main { 

   public static void main(String[] args) throws IOException { 

       Truck truck = new Truck(2017, "Scania S 500 4x2", 220); 
   } 
}
Untuk mesin Java, prosesnya akan terlihat seperti ini:
  1. Hal pertama yang terjadi adalah variabel statis kelas Vehiclediinisialisasi . Ya, saya bilang kelasnya Vehicle, bukan Truck. Variabel statis diinisialisasi sebelum konstruktor dipanggil, dan ini dimulai di kelas induk. Mari kita coba verifikasi ini. Kami menyetel vehicleCounterbidang di Vehiclekelas sama dengan 10 dan mencoba menampilkannya di Vehicledan Truckkonstruktor.

    
    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++; 
       } 
    }
    

    Kami sengaja meletakkan pernyataan println di awal konstruktor Truckuntuk memastikan bahwa bidang truk belum diinisialisasi saat vehicleCounterditampilkan.

    Dan inilah hasilnya:

    
    10 
    10
    
  2. Setelah variabel statis kelas induk diinisialisasi, variabel statis kelas anak diinisialisasi. Dalam kasus kami, ini adalah truckCounterbidang kelas Truck.

    Mari kita lakukan percobaan lain di mana kita akan mencoba menampilkan nilai truckCounterdi dalam Truckkonstruktor sebelum bidang lain diinisialisasi:

    
    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++; 
       } 
    }
    

    Seperti yang Anda lihat, nilai 10 telah ditetapkan ke variabel statis kita saat Truckkonstruktor dimulai.

  3. Masih belum waktunya untuk para konstruktor! Inisialisasi variabel berlanjut. Variabel non-statis dari kelas induk diinisialisasi ketiga. Seperti yang Anda lihat, warisan secara signifikan mempersulit proses pembuatan objek, tetapi tidak ada yang dapat Anda lakukan: Anda hanya perlu mengingat beberapa hal dalam pemrograman :)

    Sebagai percobaan, kita dapat menetapkan beberapa nilai awal ke descriptionvariabel di Vehiclekelas, lalu mengubahnya di konstruktor.

    
    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; 
       } 
    }
    

    Mari jalankan main()metode kami yang membuat truk:

    
    public class Main { 
    
       public static void main(String[] args) throws IOException { 
    
           Truck truck = new Truck(2017, "Scania S 500 4x2", 220); 
       } 
    }
    

    Kami mendapatkan hasil berikut:

    
    Initial value of the description field 
    Vehicle
    

    Ini membuktikan bahwa ketika Vehiclekonstruktor memulai, descriptionbidang telah diberi nilai.

  4. Akhirnya, saatnya para konstruktor! Lebih tepatnya, saatnya untuk konstruktor kelas dasar. Itu dipanggil pada langkah keempat dari proses pembuatan objek.

    Ini juga cukup mudah untuk diverifikasi. Mari kita coba mengeluarkan dua baris ke konsol: satu di dalam Vehiclekonstruktor kelas dasar, yang kedua di dalam Truckkonstruktor. Kita perlu diyakinkan bahwa baris di dalamnya Vehicleditampilkan terlebih dahulu:

    
    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++; 
    }
    

    Kami akan menjalankan main()metode kami dan melihat hasilnya:

    
    Hello from the Vehicle constructor! 
    Hello from the Truck constructor! 
    

    Bagus sekali. Artinya kita tidak salah :) Mari kita lanjutkan.

  5. Sekarang saatnya menginisialisasi bidang non-statis dari kelas anak, yaitu Truckkelas kita. Bidang yang langsung di dalam kelas yang sedang dibuat tidak diinisialisasi hingga langkah kelima! Mengejutkan, tapi benar :) Sekali lagi, kita akan melakukan pemeriksaan sederhana — sama seperti dengan kelas induk: kita akan memberikan beberapa nilai awal ke variabel maxSpeeddan di Truckkonstruktor kita akan memeriksa apakah nilainya telah ditetapkan sebelum konstruktor dimulai:

    
    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++; 
       } 
    }
    

    Keluaran konsol:

    
    Initial value of maxSpeed = 150
    

    Seperti yang Anda lihat,  saat Truck konstruktor dimulai, maxSpeed sudah sama dengan 150!

  6. Konstruktor Truckkelas anak dipanggil.

    Dan hanya pada titik ini, yang terakhir, konstruktor kelas yang kita buat akan dipanggil!

    Hanya pada langkah keenam bidang akan diberi nilai yang kami berikan sebagai argumen ke truk kami.

    Seperti yang Anda lihat, "membangun" truk, yaitu proses pembuatan objek, tidaklah sederhana. Tapi sepertinya kita sudah memecahnya menjadi bagian-bagian terkecil :)

Urutan tindakan selama pembuatan objek - 3 Mengapa begitu penting untuk memahami proses ini dengan baik? Bayangkan betapa tidak terduga hasil dari pembuatan objek biasa jika Anda tidak tahu persis apa yang terjadi "di bawah tenda" :) Sekarang saatnya kembali ke kursus dan menyelesaikan beberapa tugas! Semoga berhasil dan sampai jumpa lagi! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION