菜鸟的自我修炼——阿里巴巴一道笔试题浅谈

java菜鸟一枚,各种不会被各种吊打,被吊打多了慢慢也就习惯了。

相信本渣的名言:菜鸟被吊打多了,自然就成为大神了,哈哈,加油,奥力给!!!

 

回到正题,今天写下我的第一篇博客,讨论的是阿里巴巴之前的一道笔试题,

斗胆拿出来和大家探讨一下,大神看到了请移步啊 

大神:卧槽,这么简单的问题你也敢拿来怼文章? 

菜鸟:呃……,好吧😂,不是我不想怼其他的,实在是因为其他高大上的文章也不会啊😭,

留下了没有技术的泪水…… 

阿里巴巴面试题:

public class Bike { 

 public static Bike bike1=new Bike();
 public static Bike bike2=new Bike();
 
 {
  System.out.println("动态代码块");
 }
 
 static {
  System.out.println("静态代码块");
 }

 public static void main(String[] args) {
  new Bike();
 } 
 
}

输出结果:

动态代码块
动态代码块
静态代码块
动态代码块

看到输出结果,懵逼了5分钟……执行顺序完全和自己判断的不一样啊?怎么前面会输出2条“动态代码块”,不是应该只有一条么?“静态代码块”怎么排在第三了?……如果你也和我一样,请在评论区告诉我,让我知道不是只有我一个人这么菜好吗……

咳咳,淡定淡定,我知道了(偷偷打开之前的笔记),让我来仔细分析一波……

要想弄清楚上面的输出结果,我们就必须要清楚JVM类的初始化和实例化过程:

1. 先执行父类的类构造器<clinit>()方法。

2. 再执行子类的类构造器<clinit>()方法。

3. 执行父类的成员变量和非static方法块。

4. 执行父类的构造方法。

5. 执行子类的成员变量和非static方法块。

6. 执行子类的构造方法。

划重点,需要注意的是:

(1)类构造器<clinit>()方法是编译器收集类变量静态代码块的过程,类变量和静态代码块的执行顺序按在程序中的顺序执行。

(2)类的成员变量和非static方法块会被JVM放到类的构造方法里面最前面位置,它们的执行顺序按照它们在程序中的顺序执行。

按照上面的规则,大家跟着本渣走进此笔试题的内心世界看看里面的奥秘:

1. 首先程序执行main()主方法,遇到new Bike()进行类的实例化。

2. 实例化Bike类之前进行类的初始化,初始化类先执行类的父类的类构造器<clinit>()方法,由于Bike类没有父类所以执行本类的类构造器<clinit>()方法,编辑器收集类的类变量和静态代码块,既执行类变量bike1和bike2、静态代码块,按顺序执行。执行bike1和bike2就分别执行Bike类的默认构造方法public Bike(){},这时候非static代码块会被JVM放入到默认构造方法里前面位置执行,相当于执行2次以下代码

public Bike(){

 System.out.printIn("动态代码块");

}

3. 接着执行静态代码块

static {
		
    System.out.println("静态代码块");
	
}

4. 再执行Bike类的成员变量和代码块,最后执行Bike类的构造方法,由于Bike类没有成员变量所以就执行代码块

{

  System.out.println("动态代码块");

}

注意,这个时候上面代码块其实被JVM放入到Bike类中的默认构造方法里前面位置执行,也就是main方法里的new Bike()构造方法里面执行。

需要知道的是,类的初始化在加载过程中只初始化一次,但是类的实例化可以有多次!

说了这么多总结一波以上代码执行流程:

首先执行main()方法中的new Bike()实例化Bike类,实例化Bike类之前要初始化Bike类,执行Bike类的类构造器<clinit>()方法,编辑器收集类变量和静态代码块,也就是执行public static Bike bike1=new Bike()和public static Bike bike2=new Bike(),分别调用Bike类的构造方法,这个时候代码块{Sysem.out.println("动态代码块");}被JVM放入Bike类的构造方法里面执行输出,随后执行Bike类的静态代码块static { System.out.println("静态代码块");},最后执行Bike类的成员变量和代码块以及构造方法,由于Bike类中没有成员变量而代码块{Sysem.out.println("动态代码块");}被JVM放入Bike类的构造方法里执行,也就是main方法里new Bike()构造方法里面执行。

各位客官懂了吧,第一次写博客有写的不对的地方,欢迎批评指正!创作不易,欢迎点赞转发哦,各位客官的支持是旁听生李同学最大的创作动力,谢谢大家!

 

 

 

 

 

 

 

 

 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值