java类实例化顺序+经典的面试题

java类实例化顺序+经典的面试题

1 类初始化阶段

  • 类初始化阶段底层有方法完成,方法是有静态变量赋值语句和静态代码块的结合而形成的。
  • 静态变量赋值语句和静态代码块的执行顺序有其本身编码顺序决定,自上往下执行。
  • 如果父类存在静态资源的初始化,那么父类会优先与子类完成执行方法。因为子类是依赖父类而存在的。
  • 一个类中如果没有静态变量的赋值也没有静态代码块,不会存在方法

2 对象的创建和初始化阶段

  • 对象的创建及初始化阶段,对象空间的开辟是由new指令完成的。对应空间中实例变量的初始化则由方法完成的。
  • 方法由实例变量赋值语句,实例代码块,构造方法结合而成,每个java中的构造方法都对应了一个方法。
  • 方法中先执行父类的方法,然后执行本类的方法剩下的内容。如下图:

java类实例化顺序+经典的面试题_第1张图片

3面试题

3.1 father

package 初始化问题;

public class Father {
    {
        System.out.println("3");
    }

    private int i = test();
    private static int j = method();

    static {
        System.out.println("1");
    }

    Father() {
        System.out.println("2");
    }


    private int test() {
        System.out.println("4");
        return 1;
    }

    private static int method() {
        System.out.println("5");
        return 1;
    }
}

3.2 son

package 初始化问题;

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

    static {
        System.out.println("6");
    }

    Son() {
        System.out.println("7");
    }

    {
        System.out.println("8");
    }

    private int test() {
        System.out.println("9");
        return 1;
    }

    private static int method() {
        System.out.println("10");
        return 1;
    }

    public static void main(String[] args) {
        Son son = new Son();
        System.out.println("----------");
        Son son1 = new Son();
    }
}

3.3 测试结果

5
1
10
6
3
4
2
9
8
7
----------
3
4
2
9
8
7

你可能感兴趣的:(面试题)