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

0
2122
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