Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu quá trình khởi tạo các biến static trong Java. Trong quá trình tải các class JVM sẽ thực hiện theo chu trình sau đây.
Đầu tiên các class sẽ được tải và liên kết. Sau đó, trong giai đoạn “initialize” các biến sẽ được khởi tạo tại đây. Và cuối cùng hàm main sẽ được gọi để thực thi chương trình.
Class Variable
Trong Java class variable nghĩa là các biến của class hay các tên thân thuộc mà chúng ta thường gọi các biến static. Nghĩa là các biến static thuộc về một class chứ không thuộc sở hữu riêng của bất kỳ instance – object nào của class này. Do đó các biến static được khởi tạo ở giai đoạn Class variable initialization.
Sau khi các biến static được khởi tạo, các instace của class này sẽ dùng chung các biến static này. Cho ví dụ như sau
public class StaticVariableDemo { public static int i; public static int j = 20; public StaticVariableDemo() {} }
Trong ví dụ trên, đầu tiên JVM sẽ tạo một Class object cho StaticVariableDemo, sau đó static initializers gán các giá trị cho các biến static này. Ở đây biến i sẽ có giá trị mặc định là 0 và j là 20.
Lưu ý là các biến static chỉ được khởi tạo duy nhất tạo thời điểm ứng dụng bắt đầu thực thi. Vì thế các biến static luôn được khởi tạo đầu tiên và trước bất kỳ một biến non-static nào.
Static block
Hãy xem ví dụ sau
public class StaticVariableDemo { public static int z; static { z = 30; } public StaticVariableDemo() {} }
Trong trường hợp này, việc khởi tạo biến static cũng sẽ theo trình tự trên. Ban đầu JVM gán biến z thành giá trị int mặc định là 0. sau đó static block sẽ thay đổi giá trị của nó thành 30.
Biến Static trong Nested Class
Xem ví dụ sau
public class StaticVariableDemo { public StaticVariableDemo() {} static class Nested { public static String nestedClassStaticVariable = "test"; } }
Trong trường hợp này, StaticVariableDemo sẽ tải Nested class và tiện thể sẽ khởi tạo biến nestedClassStaticVariable bên trong nó.
Nguồn tham khảo
https://www.baeldung.com/java-static-variables-initialization
https://stackoverflow.com/questions/8704423/when-are-static-variables-initialized