CodeGym /Blog Java /Ngẫu nhiên /Trình tự các hành động trong quá trình tạo đối tượng

Trình tự các hành động trong quá trình tạo đối tượng

Xuất bản trong nhóm
CHÀO! Bài học hôm nay sẽ khá... uh... đa diện :) theo nghĩa là chúng ta sẽ đề cập đến nhiều chủ đề, nhưng tất cả chúng sẽ liên quan đến quá trình tạo đối tượng . Chuỗi hành động trong quá trình tạo đối tượng - 1Chúng tôi sẽ phân tích nó từ đầu đến cuối: cách các hàm tạo được gọi, các trường (bao gồm cả trường tĩnh) được khởi tạo như thế nào và theo thứ tự nào, v.v. Trước đây chúng tôi đã đề cập đến một số điểm được thảo luận trong bài viết, vì vậy bạn có thể xem qua tài liệu về các hàm tạo của lớp cơ sở . Đầu tiên, hãy nhớ lại cách một đối tượng được tạo ra. Bạn nhớ rõ quá trình này trông như thế nào từ quan điểm của nhà phát triển: anh ta tạo một lớp, viết newvà mọi thứ đã sẵn sàng :) Ở đây chúng ta sẽ nói về những gì xảy ra bên trong máy tính và máy Java khi chúng ta viết, chẳng hạn:

Cat cat = new Cat();
Chúng tôi đã nói về điều này trước đây, nhưng để đề phòng, chúng tôi sẽ nhắc bạn:
  • Đầu tiên, bộ nhớ để lưu trữ đối tượng được cấp phát.
  • Tiếp theo, máy Java tạo một tham chiếu đến đối tượng (trong trường hợp của chúng tôi, tham chiếu là Cat cat).
  • Cuối cùng, các biến được khởi tạo và hàm tạo được gọi (chúng ta sẽ xem xét quá trình này chi tiết hơn).
Ngoài ra, từ bài học về vòng đời của đối tượng , bạn có thể nhớ rằng một đối tượng tồn tại miễn là có ít nhất một tham chiếu đến nó. Nếu không còn gì, thì đối tượng sẽ trở thành con mồi cho người thu gom rác. Chuỗi hành động trong quá trình tạo đối tượng - 2Hai điểm đầu tiên này không nên đặt ra bất kỳ câu hỏi đặc biệt nào. Cấp phát bộ nhớ là một quá trình đơn giản và chỉ có hai kết quả có thể xảy ra: có bộ nhớ hoặc không có :) Và việc tạo liên kết không phải là điều bất thường. Nhưng điểm thứ ba đại diện cho một tập hợp toàn bộ các hoạt động được thực hiện theo thứ tự nghiêm ngặt. Tôi không phải là người thích học nhồi nhét để làm bài kiểm tra, nhưng bạn cần hiểu rõ quy trình này và bạn cần ghi nhớ chuỗi thao tác này. Khi chúng ta nói về quá trình tạo đối tượng trong các bài học trước, bạn thực sự chưa biết gì về kế thừa, nên việc giải thích một số điều là có vấn đề. Bây giờ bạn đã biết khá nhiều và cuối cùng chúng ta có thể xem xét câu hỏi này một cách đầy đủ :) Vì vậy, điểm thứ ba nói rằng " Cuối cùng, các biến được khởi tạo và hàm tạo được gọi. " Nhưng tất cả điều này diễn ra theo thứ tự nào? Để hiểu rõ hơn, hãy tạo hai lớp siêu đơn giản — lớp cha và lớp con:

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++; 
   } 
}
Lớp này Trucklà một triển khai của một chiếc xe tải với các trường đại diện cho năm, kiểu xe và tốc độ tối đa của nó. Bây giờ chúng tôi muốn tạo một đối tượng như vậy:

public class Main { 

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

       Truck truck = new Truck(2017, "Scania S 500 4x2", 220); 
   } 
}
Đối với máy Java, quy trình sẽ như sau:
  1. Điều đầu tiên xảy ra là các biến tĩnh của Vehiclelớp được khởi tạo . Vâng, tôi đã nói Vehiclelớp học, không phải Truck. Các biến tĩnh được khởi tạo trước khi các hàm tạo được gọi và điều này bắt đầu trong lớp cha. Hãy thử kiểm chứng điều này. Chúng tôi đặt vehicleCountertrường trong Vehiclelớp bằng 10 và cố gắng hiển thị nó trong cả hàm tạo VehicleTruckhàm tạo.

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

    Chúng tôi cố tình đặt câu lệnh println ở đầu hàm Trucktạo để đảm bảo rằng các trường của xe tải chưa được khởi tạo khi vehicleCounterđược hiển thị.

    Và đây là kết quả:

    
    10 
    10
    
  2. Sau khi các biến tĩnh của lớp cha được khởi tạo, các biến tĩnh của lớp con cũng được khởi tạo. Trong trường hợp của chúng ta, đây là truckCountertrường của Trucklớp.

    Hãy thực hiện một thử nghiệm khác, nơi chúng tôi sẽ cố gắng hiển thị giá trị của truckCounterbên trong Truckhàm tạo trước khi các trường khác được khởi tạo:

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

    Như bạn có thể thấy, giá trị 10 đã được gán cho biến tĩnh của chúng ta khi Truckhàm tạo bắt đầu.

  3. Vẫn chưa đến lúc cho các nhà xây dựng! Quá trình khởi tạo biến vẫn tiếp tục. Các biến không tĩnh của lớp cha được khởi tạo thứ ba. Như bạn có thể thấy, tính kế thừa làm phức tạp đáng kể quá trình tạo một đối tượng, nhưng bạn không thể làm gì với nó: Bạn chỉ cần ghi nhớ một số điều trong lập trình :)

    Như một thử nghiệm, chúng ta có thể gán một số giá trị ban đầu cho descriptionbiến trong Vehiclelớp, sau đó thay đổi nó trong hàm tạo.

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

    Hãy chạy main()phương thức của chúng ta để tạo ra một chiếc xe tải:

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

    Chúng tôi nhận được kết quả sau:

    
    Initial value of the description field 
    Vehicle
    

    Điều này chứng tỏ rằng khi Vehiclehàm tạo bắt đầu, descriptiontrường đã được gán một giá trị.

  4. Cuối cùng, đã đến lúc cho các nhà xây dựng! Chính xác hơn, đã đến lúc dành cho hàm tạo của lớp cơ sở. Nó được gọi trong bước thứ tư của quá trình tạo đối tượng.

    Điều này cũng khá dễ kiểm chứng. Hãy thử xuất hai dòng ra bàn điều khiển: một dòng bên trong Vehiclehàm tạo của lớp cơ sở, dòng thứ hai bên trong Truckhàm tạo. Chúng ta cần được thuyết phục rằng dòng bên trong Vehicleđược hiển thị đầu tiên:

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

    Chúng ta sẽ chạy main()phương thức của mình và xem kết quả:

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

    Xuất sắc. Điều đó có nghĩa là chúng ta không nhầm :) Let's going on.

  5. Bây giờ là lúc khởi tạo các trường không tĩnh của lớp con, tức là Trucklớp của chúng ta. Các trường ngay trong lớp được khởi tạo không được khởi tạo cho đến bước thứ năm! Đáng ngạc nhiên, nhưng đúng :) Một lần nữa, chúng ta sẽ thực hiện một kiểm tra đơn giản — giống như với lớp cha: chúng ta sẽ nhập một số giá trị ban đầu cho biến maxSpeedvà trong Truckhàm tạo, chúng ta sẽ kiểm tra xem giá trị đó đã được gán trước khi hàm tạo bắt đầu chưa:

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

    Đầu ra bảng điều khiển:

    
    Initial value of maxSpeed = 150
    

    Như bạn có thể thấy,  khi Truck hàm tạo bắt đầu, maxSpeed nó đã bằng 150!

  6. Hàm tạo của Trucklớp con được gọi.

    Và chỉ tại thời điểm này, cuối cùng, hàm tạo của lớp mà chúng ta đang khởi tạo mới được gọi!

    Chỉ trong bước thứ sáu, các trường sẽ được gán các giá trị mà chúng tôi chuyển làm đối số cho xe tải của mình.

    Như bạn có thể thấy, việc "dựng" một chiếc xe tải, tức là quá trình tạo đối tượng, không hề đơn giản. Nhưng có vẻ như chúng tôi đã chia nó thành những phần nhỏ nhất :)

Chuỗi các thao tác trong quá trình tạo đối tượng - 3 Tại sao việc hiểu rõ quy trình này lại quan trọng đến vậy? Hãy tưởng tượng kết quả của việc tạo một đối tượng bình thường có thể bất ngờ như thế nào nếu bạn không biết chính xác điều gì đang xảy ra "dưới mui xe" :) Bây giờ là lúc quay lại khóa học và hoàn thành một số nhiệm vụ! Chúc may mắn và hẹn gặp lại! :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION