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

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

1 类初始化阶段

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

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

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

在这里插入图片描述

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值