java类的初始化和实例化

1、面试题

Father.java

package org.example.classinit;

public class Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.println("Father 静态块 = (1)");
    }

    public Father(){
        System.out.println("Father 构造器 = (2)");
    }

    {
        System.out.println("Father 代码块 = (3)");
    }

    private int test() {
        System.out.println("Father 成员方法 test() = (4)");
        return 0;
    }
    private static int method() {
        System.out.println("Father 类方法 method() = (5)");
        return 0;
    }
}

Son.java

package org.example.classinit;

public class Son extends Father{
    private int i = test();
    private static int j = method();

    static {
        System.out.println("Son 静态块 = (6)");
    }

    public Son(){
        System.out.println("Son 构造器 = (7)");
    }

    {
        System.out.println("Son 代码块 = (8)");
    }

    private int test() {
        System.out.println("Son 成员方法 test() = (9)");
        return 0;
    }
    private static int method() {
        System.out.println("Son 类方法 method() = (10)");
        return 0;
    }
}

SonTest.java

package org.example.classinit;


import org.junit.Test;

public class SonTest {

    @Test
    public void test01(){
        Son s1 = new Son();
        System.out.println("-------------");
        Son s2 = new Son();

    }
    
}

2、结果

Father 类方法 method() = (5)
Father 静态块 = (1)
Son 类方法 method() = (10)
Son 静态块 = (6)
Father 成员方法 test() = (4)
Father 代码块 = (3)
Father 构造器 = (2)
Son 成员方法 test() = (9)
Son 代码块 = (8)
Son 构造器 = (7)
-------------
Father 成员方法 test() = (4)
Father 代码块 = (3)
Father 构造器 = (2)
Son 成员方法 test() = (9)
Son 代码块 = (8)
Son 构造器 = (7)