JVM 实例化练习题

 习题 1:据说是某大厂的经典面试题, 你能写出答案吗?

public class Test{
    public static int k=0;                                   
    public static Test t1=new Test("t1");         
    public static Test t2=new Test("t2");         
    public static int i=print("i");                        
    public static int n=99;                                
    public int j=print("j");    
                
    static {print("静态块");}

   public Test(String str){
        System.out.println((++k)+":"+str+"  i="+i+" n="+n);
        ++i;
        ++n;
   }

   public static int print(String str){
       System.out.println((++k)+":"+str+"  i="+i+" n="+n);
       ++n;
       return ++i;
   }

   public static void main(String[] ar gs) {
       new Test("init");
   }
}

想要做对这道题我们必须了解类的加载过程和实例化过程:

  1. 类加载(准备和初始化)过程(静态属性、静态方法声明-----静态属性赋值、静态块)注意先父类后子类
  2. 实例化过程(普通属性、普通方法声明-----普通属性赋值、构造块、构造方法中的代码)也是先父类后子类
  3. 如果在类加载的赋值过程中调用了实例化过程(如new了本类对象),则会暂停类加载过程先执行实例化过程,执行完毕再回到类加载过程
---------- 运行结果 ----------
1:j      i=0     n=0
2:t1     i=1     n=1
3:j      i=2     n=2
4:t2     i=3     n=3
5:i      i=4     n=4
6:静态块  i=5     n=99
7:j      i=6     n=100
8:init   i=7     n=101
输出完成 (耗时 0 秒) - 正常终止

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值