CodeGym /Blog Java /rawak /Urutan tindakan semasa penciptaan objek
John Squirrels
Tahap
San Francisco

Urutan tindakan semasa penciptaan objek

Diterbitkan dalam kumpulan
Hai! Pelajaran hari ini akan menjadi agak... eh... pelbagai rupa :) dalam erti kata bahawa kita akan merangkumi pelbagai topik, tetapi semuanya akan berkaitan dengan proses penciptaan objek . Urutan tindakan semasa penciptaan objek - 1Kami akan menganalisisnya dari awal hingga akhir: bagaimana pembina dipanggil, bagaimana dan dalam apakah medan tertib (termasuk medan statik) dimulakan, dsb. Kami sebelum ini telah menyentuh beberapa perkara yang dibincangkan dalam artikel, supaya anda boleh melihat sekilas bahan pada pembina kelas asas . Mula-mula, mari kita ingat semula bagaimana objek dicipta. Anda masih ingat bagaimana proses ini kelihatan dari sudut pandangan pembangun: dia mencipta kelas, menulis new, dan semuanya sudah sedia :) Di sini kita akan bercakap tentang perkara yang berlaku di dalam komputer dan mesin Java apabila kita menulis, sebagai contoh:

Cat cat = new Cat();
Kami telah membincangkan perkara ini sebelum ini, tetapi untuk berjaga-jaga kami akan mengingatkan anda:
  • Pertama, memori untuk menyimpan objek diperuntukkan.
  • Seterusnya, mesin Java mencipta rujukan kepada objek (dalam kes kami rujukannya ialah kucing Cat).
  • Akhirnya, pembolehubah dimulakan dan pembina dipanggil (kita akan melihat proses ini dengan lebih terperinci).
Selain itu, daripada pelajaran tentang kitaran hayat objek , anda mungkin ingat bahawa objek kekal selagi terdapat sekurang-kurangnya satu rujukan kepadanya. Jika tidak ada yang tinggal, maka objek itu menjadi mangsa pemungut sampah. Urutan tindakan semasa penciptaan objek - 2Dua perkara pertama ini tidak sepatutnya menimbulkan sebarang persoalan khas. Peruntukan memori adalah proses yang mudah, dan hanya terdapat dua kemungkinan hasil: sama ada terdapat memori atau tidak :) Dan mencipta pautan bukanlah sesuatu yang luar biasa. Tetapi titik ketiga mewakili satu set keseluruhan operasi yang dilaksanakan dalam susunan yang ketat. Saya bukan peminat menjejalkan ujian, tetapi anda perlu memahami proses ini dengan baik dan anda perlu menghafal urutan operasi ini. Apabila kita bercakap tentang proses penciptaan objek dalam pelajaran sebelumnya, anda masih belum tahu apa-apa tentang warisan, jadi menjelaskan beberapa perkara adalah bermasalah. Sekarang anda tahu banyak perkara dan akhirnya kami boleh mempertimbangkan soalan ini sepenuhnya :) Jadi perkara ketiga berkata " Akhirnya, pembolehubah dimulakan dan pembina dipanggil. " Tetapi dalam urutan apakah semua ini berlaku? Untuk pemahaman yang lebih baik, mari kita cipta dua kelas yang sangat mudah — ibu bapa 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 Truckialah pelaksanaan trak dengan medan yang mewakili tahun, model dan kelajuan maksimumnya. Sekarang kita mahu mencipta satu objek sedemikian:

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 kelihatan seperti ini:
  1. Perkara pertama yang berlaku ialah pembolehubah statik kelas Vehicledimulakan . Ya, saya kata Vehiclekelas, bukan Truck. Pembolehubah statik dimulakan sebelum pembina dipanggil, dan ini bermula dalam kelas induk. Mari cuba sahkan ini. Kami menetapkan vehicleCountermedan dalam Vehiclekelas sama dengan 10 dan cuba memaparkannya dalam kedua-dua Vehicledan Truckpembina.

    
    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 pada permulaan pembina Truckuntuk memastikan bahawa medan trak masih belum dimulakan apabila vehicleCounterdipaparkan.

    Dan inilah hasilnya:

    
    10 
    10
    
  2. Selepas pembolehubah statik kelas induk dimulakan, pembolehubah statik kelas anak dimulakan. Dalam kes kami, ini adalah truckCounterbidang kelas Truck.

    Mari kita lakukan percubaan lain di mana kita akan cuba memaparkan nilai truckCounterdi dalam Truckpembina sebelum medan lain dimulakan:

    
    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 pun diberikan kepada pembolehubah statik kami apabila Truckpembina bermula.

  3. Masih belum masanya untuk pembina! Inisialisasi pembolehubah diteruskan. Pembolehubah bukan statik kelas induk dimulakan ketiga. Seperti yang anda lihat, pewarisan merumitkan proses mencipta objek dengan ketara, tetapi tiada apa yang boleh anda lakukan mengenainya: Anda hanya perlu menghafal beberapa perkara dalam pengaturcaraan :)

    Sebagai percubaan, kita boleh menetapkan beberapa nilai awal kepada descriptionpembolehubah dalam Vehiclekelas, dan kemudian menukarnya dalam pembina.

    
    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()kaedah kami yang mencipta trak:

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

    Kami mendapat keputusan berikut:

    
    Initial value of the description field 
    Vehicle
    

    Ini membuktikan bahawa apabila Vehiclepembina memulakan descriptionmedan telah diberikan nilai.

  4. Akhirnya, sudah tiba masanya untuk pembina! Lebih tepat lagi, sudah tiba masanya untuk pembina kelas asas. Ia digunakan dalam langkah keempat proses penciptaan objek.

    Ini juga agak mudah untuk disahkan. Mari cuba mengeluarkan dua baris ke konsol: satu di dalam Vehiclepembina kelas asas, yang kedua di dalam Truckpembina. Kita perlu yakin bahawa baris di dalam Vehicledipaparkan 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()kaedah kami dan melihat hasilnya:

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

    Cemerlang. Maknanya kita tak silap :) Jom teruskan.

  5. Kini tiba masanya untuk memulakan medan bukan statik kelas kanak-kanak, iaitu Truckkelas kami. Medan serta-merta dalam kelas yang dimulakan tidak dimulakan sehingga langkah kelima! Mengejutkan, tetapi benar :) Sekali lagi, kami akan melakukan semakan mudah — sama seperti kelas induk: kami akan beberapa nilai awal kepada pembolehubah maxSpeeddan dalam Truckpembina kami akan menyemak bahawa nilai telah diberikan sebelum pembina bermula:

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

    Output konsol:

    
    Initial value of maxSpeed = 150
    

    Seperti yang anda lihat,  apabila Truck pembina bermula, maxSpeed sudah bersamaan dengan 150!

  6. Pembina Truckkelas kanak-kanak dipanggil.

    Dan hanya pada ketika ini, yang terakhir sekali, pembina kelas yang kita sedang gunakan akan dipanggil!

    Hanya dalam langkah keenam, medan akan diberikan nilai yang kami berikan sebagai hujah kepada trak kami.

    Seperti yang anda lihat, "membina" trak, iaitu proses penciptaan objek, bukanlah mudah. Tetapi nampaknya kita telah memecahkannya kepada bahagian yang paling kecil :)

Urutan tindakan semasa penciptaan objek - 3 Mengapa sangat penting untuk memahami proses ini dengan baik? Bayangkan betapa tidak dijangka hasil mencipta objek biasa jika anda tidak tahu dengan tepat apa yang berlaku "di bawah tudung" :) Kini tiba masanya untuk kembali ke kursus dan menyelesaikan beberapa tugas! Semoga berjaya dan jumpa lagi! :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION