Khối Khởi tạo thể hiện trong JAVA

Khối khởi tạo thể hiện được sử dụng để khởi tạo các biến thể hiện. Nó chạy mỗi lần khi đối tượng của lớp được tạo.

Khối khởi tạo thể hiện trong JAVA
Khối khởi tạo thể hiện trong JAVA

Việc khởi tạo biến thể hiện (instance variables) có thể được thực hiện trực tiếp.

Nhưng có thể được thực hiện các thao tác bổ sung, khởi tạo biến đối tượng trong khối khởi tạo thể hiện.

Và bạn có thể hỏi:

Tại sao phải sử dụng khối khởi tạo thể hiện để khởi tạo biến thể hiện trong JAVA?

Trong khi chúng ta có thể làm trực tiếp như thế này:

class Bike{  
    int speed = 100;  
}

Chúng ta hãy xem ví dụ đơn giản về khối khởi tạo thể hiện thực hiện khởi tạo như sau:

class Bike7{  
    int speed;  
      
    Bike7(){
        System.out.println("Tốc độ là: "+speed);
    }
    // Khối khởi tạo thể hiện
    {speed = 100;}
       
    public static void main(String args[]){  
        Bike7 b1 = new Bike7();
        Bike7 b2 = new Bike7();
    }      
}  

Kết quả:

Tốc độ là: 100
Tốc độ là: 100

Như bạn thấy, tốc độ của chiếc xe mới giống chiếc xe cũ, nó chẳng khác gì cả.

Trong JAVA: Khối khởi tạo thể hiện hay Hàm tạo được gọi đầu tiên?

Để hiểu vấn đề này, chúng ta xem xét ví dụ sau:

class Bike8{  
    int speed;  
      
    Bike8(){
        System.out.println("Constructor được gọi");
    }  
   
    {System.out.println("Khối khởi tạo thể hiện được gọi");}
   
    public static void main(String args[]){
        Bike8 b1 = new Bike8();
        Bike8 b2 = new Bike8();
    }      
}  

Kết quả:

Khối khởi tạo thể hiện được gọi
Constructor được gọi
Khối khởi tạo thể hiện được gọi
Constructor được gọi

Trong ví dụ trên, có vẻ như khối khởi tạo thể hiện được gọi trước tiên.

Nhưng KHÔNG.

Thực ra, khối khởi tạo thể hiện được gọi tại thời điểm tạo đối tượng.

Trình biên dịch java sao chép khối khởi tạo đối tượng trong hàm tạo sau câu lệnh super() đầu tiên.

Vì vậy, constructor được gọi tới đầu tiên.

Hãy hiểu nó bằng hình dưới đây:

Khi biên dịch, trình biên dịch sao chép khối khởi tạo và đặt nó dưới hàm super()
Khi biên dịch, trình biên dịch sao chép khối khởi tạo và đặt nó dưới hàm super()

Như bạn thấy, sau khi biên dịch, khối khởi tạo thể hiện được sao chép vào trong hàm tạo B, đặt dưới hàm super().

Do đó, Hàm tạo B được gọi đến trước, sau đó mới đến khối khởi tạo thể hiện được gọi.

Tham khảo:

Quy tắc khối khởi tạo thể hiện

Chủ yếu có ba quy tắc cho khối khởi tạo thể hiện:

  • Khối khởi tạo thể hiện được tạo khi đối tượng của lớp được tạo.
  • Khối khởi tạo thể hiện được gọi sau khi hàm tạo của lớp cha được gọi (tức là sau lệnh gọi hàm tạo super()).
  • Khối khởi tạo thể thiện xuất hiện theo thứ tự xuất hiện.

Ví dụ khối khởi tạo thể hiện được gọi sau super()

class A{  
    A(){  
        System.out.println("Hàm tạo của class cha được gọi");  
    }  
}

class B2 extends A{  
    B2(){  
        super();  
        System.out.println("Hàm tạo của class con được gọi");  
    }  
  
    {System.out.println("Khối khởi tạo thể hiện được gọi");}  
  
    public static void main(String args[]){  
        B2 b = new B2(); 
    }  
}  

Kết quả:

Hàm tạo của class cha được gọi
Khối khởi tạo thể hiện được gọi
Hàm tạo của class con được gọi

Một ví dụ khác về khối khởi tạo thể hiện

class A{  
    A(){  
        System.out.println("Hàm tạo của class cha được gọi");  
    }  
}  
  
class B3 extends A{  
    B3(){  
        super();  
        System.out.println("Hàm tạo của class con được gọi");  
    }  
  
    B3(int a){  
        super();  
        System.out.println("Hàm tạo của class con được gọi "+a);  
    }  
  
    {System.out.println("Khối khởi tạo thể hiện được gọi");}  
  
    public static void main(String args[]){  
        B3 b1 = new B3();
        B3 b2 = new B3(10);
    }  
}  

Bạn thử đoán xem, kết quả nhận được là gì?

Hàm tạo của class cha được gọi
Khối khởi tạo thể hiện được gọi
Hàm tạo của class con được gọi
Hàm tạo của class cha được gọi
Khối khởi tạo thể hiện được gọi
Hàm tạo của class con được gọi 10

JAVA DEV

Bài viết gần đây

Hướng dẫn tải và Cài đặt Java cho Windows 10 (Chi tiết)

Bài viết này mình sẽ hướng dẫn bạn cách tải và cài đặt Java cho Windows 10 để học lập trình Java.

Tìm hiểu về instanceof trong JAVA

Một vài ví dụ đơn giản để bạn hiểu hơn về toán tử instanceof trong Java. Cũng như cách sử dụng instanceof trong thực tế như thế nào.

Static Binding và Dynamic Binding trong Java

Bạn đang tìm hiểu về Binding trong Java? Về cơ bản, việc kết nối một cuộc gọi phương thức...

Tìm hiểu về Đa hình trong JAVA

Đa hình (Polymorphism) trong Java là một khái niệm để chỉ những hành động có thể thực hiện theo nhiều cách khác nhau.

Từ khóa FINAL trong JAVA

Từ khóa final có thể được áp dụng với các biến, một biến final không có giá trị, nó được gọi là biến final trống hoặc biến cuối cùng chưa được khởi tạo.

Khối Khởi tạo thể hiện trong JAVA

Khối khởi tạo thể hiện được sử dụng để khởi tạo các biến thể hiện. Nó chạy mỗi lần khi đối tượng của lớp được tạo.

Leave a reply

Please enter your comment!
Please enter your name here