Jacobvu84 / selenium-vietnam-training-course

Questions Tracking
7 stars 5 forks source link

#01: Thứ tự khởi tạo các đối tượng trong java #37

Open Jacobvu84 opened 6 years ago

Jacobvu84 commented 6 years ago

SubClass

class Mother {
    String p = verify("4");
    static String pstatic = verify("3");
    static {
        System.out.print("8");
    }

    static String verify(String s) {
        System.out.print(s);
        return s;
    }

    Mother() {
        System.out.print("3");
    }
}

SupClass:

public class OverInitializedClass extends Mother {

    static {
        System.out.print("4");
    }

    String c = verify("0");

    static String cstatic = verify("9");

    OverInitializedClass() {
        super();
        System.out.print("3");
    }

And

    public static void main(String[] args) {
        System.out.print("8");
        OverInitializedClass over = new OverInitializedClass();
        System.out.print("1");
    }

Chương trình sẽ in ra cái gì và tại sao ?

Jacobvu84 commented 6 years ago

Bởi vì ngôn ngữ lập trình Java có thể chạy đa luồng (multithreaded) nên việc khởi tạo các giá trị cần phải được đồng bộ ( có trình tự) một cách chính xác.

Trong câu hỏi trên trình tự thực hiện các lệnh sẽ là

1a - Biến tĩnh (Field static) của SubClass ( lớp cha) // 3 1b - Phần block code của SubClass // 8 2a - Phần block code của SupClass ( lớp con ) // 4 2b - Biến tĩnh (Field static) của SupClass // 9 3 - Các lệnh trong hàm main() trước khi khai báo đối tượng // 8 4 - Các biến non-static của SubClass // 4 5 - Hàm khởi tạo ( contrustor) của SubClass // 3 6 - Các biến non-static của SupClass // 0 7 - Hàm khởi tạo ( contrustor) của SupClass // 3 8 - Phần còn lại của main (..)

Và kết quả cuối cùng là : 3849843031

Jacobvu84 commented 6 years ago

Một ví dụ khác

public class CheckPriori {

    public static void main(String[] args) {

        Parent a = new Parent();

        System.out.println(a.getA());
    }

}

class Parent {

    private static int a = 4; // (1)

    public int getA() {
        return a;
    }

    static {
        a = 9; // (2)
    }

    public Parent() {
        a = 6; // (3)
    }

}

Theo trình tự thì biến sẽ được khởi tạo trước (1), rồi tới static block code ( hoặc block code ) (2) và cuối cùng mới tới hàm khởi tạo. Kết quả của ví trên sẽ in ra 6