Trong Java, chúng ta có 2 loại blocks, đó là static block và instance block, và có thể khai báo nhiều constructors khác nhau. Vậy thứ tự thực thi các blocks, constructors trong Java như thế nào? Trong bài viết này, chúng ta hãy cùng nhau tìm hiểu nhé các bạn!
Static block là một khối gồm nhiều dòng code, thuộc về một class cụ thể nào đó chứ không thuộc về instance của một class. Chúng ta định nghĩa nó nằm trong từ khóa static, ví dụ như sau:
1 2 3 4 5 6 7 8 |
package com.huongdanjava; public class StaticBlock { static { System.out.print("This is static block"); } } |
Instance block cũng là một khối gồm nhiều dòng code, nhưng nó không thuộc về class mà thuộc về instance của class đó. Nó được thực thi mỗi khi instance của class được khởi tạo. Chúng ta định nghĩa nó như sau:
1 2 3 4 5 6 7 8 |
package com.huongdanjava; public class InstanceBlock { { System.out.print("This is instance block"); } } |
Còn constructor thì chắc hẳn mình không cần phải nói nữa. Ai học về Java mà không biết nó, các bạn nhỉ :D.
Vậy thứ tự thực thi của các blocks, constructors sẽ như thế nào? Hãy xem xét đoạn code sau nhé các bạn!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.huongdanjava; public class Example { static { System.out.print("This is static block\n"); } { System.out.print("This is instance block\n"); } public Example() { System.out.print("This is constructor\n"); } public static void main(String[] args) { Example e = new Example(); } } |
Kết quả:
Rõ ràng, các bạn thấy, thứ tự thực thi của chúng sẽ như sau:
- Đầu tiên là thực hiện những đoạn code trong static block trước.
- Sau đó mới tới những đoạn code trong instance block.
- Và code trong constructor sẽ thực hiện sau cùng.
Vậy trong trường hợp lớp có kế thừa như ví dụ sau thì sao nhỉ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.huongdanjava; public class Base { static { System.out.print("Base static block\n"); } { System.out.print("Base instance block\n"); } public Base() { System.out.print("Base constructor\n"); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.huongdanjava; public class Derived extends Base { static { System.out.print("Derived static block\n"); } { System.out.print("Derived instance block\n"); } public Derived() { System.out.print("Derived constructor\n"); } public static void main(String[] args) { System.out.print("Main method\n"); Derived d = new Derived(); } } |
Kết quả:
Trong trường hợp này, thứ tự thực thi sẽ ưu tiên cho lớp cha trước rồi mới đến lớp con. Nhưng nguyên tắc thì các khối code static vẫn thực thi trước tiên các bạn nhé!
Tóm lại là:
- Static block sẽ chạy khi class được load vào JVM.
- Instance block sẽ chạy mỗi khi instance mới của class được khởi tạo.
- Instance block sẽ chạy sau khi super constructor đã chạy và trước khi constructor của class hiện tại được chạy.