一道java代码块面试题

题目内容就是搞清楚下面程序之间执行的顺序:

/*
 * 代码块的面试题
 * 
 * 	Coder静态代码块执行---Coder构造代码块执行---Coder无参空构造执行
 * 
 */
 public class Day12_1 {
	public static void main(String[] args) {
		Coder c = new Coder();
	}
}
class Coder{
	static {
		System.out.println("Coder静态代码块执行");
	}
	{
		System.out.println("Coder构造代码块执行");
	}
	public Coder() {
		System.out.println("Coder无参空构造执行");
	}
}

简单的Coder类中执行顺序大家肯定都知道,静态代码块随着类的加载而加载。

  1. 故在主函数中创建对象时Coder会被加载,就会先加载静态代码块;
  2. 接下来创建对象会调用构造方法,但在构造方法加载前,会执行构造方法的共性—构造代码块;
  3. 构造代码块执行完后会执行无参构造方法。

但接下来我们深入分析,看一个进阶版的代码:

/*
 * 代码块的面试题
 * 
 * 	Coder静态代码块执行---Coder构造代码块执行---Coder无参空构造执行
 * 
 * 	Day12_1静态代码块执行---Day12_1的主函数执行了---Coder静态代码块执行---Coder构造代码块执行---Coder无参空构造执行
 * 	Coder构造代码块执行---Coder无参空构造执行
 */
public class Day12_1 {
	static {
		System.out.println("Day12_1静态代码块执行");
	}
	{
		System.out.println("Day12_1构造代码块执行");
	}
	public Day12_1(){
		System.out.println("Day12_1构造代码块执行");
	}
	public static void main(String[] args) {
		System.out.println("Day12_1的主函数执行了");
		Coder c = new Coder();
		Coder c2 = new Coder();
	}
}
class Coder{
	static {
		System.out.println("Coder静态代码块执行");
	}
	{
		System.out.println("Coder构造代码块执行");
	}
	public Coder() {
		System.out.println("Coder无参空构造执行");
	}
}

现在程序顺序就变得不那么清晰了,我们来简单分析一下:

  1. 程序执行入口为主方法,故执行程序会先加载Day12_1类;
  2. 静态代码块随着类的加载而加载,首先输出“Day12_1静态代码块执行”;
  3. 进入主函数,会输出“Day12_1的主函数执行了”;
  4. 接下来创建Coder对象,创建第一个对象的执行顺序为“Coder静态代码块执行—Coder构造代码块执行—Coder无参空构造执行” (详细分析看上面);
  5. 但创建第二个Coder对象和第一个有一点不同,此时静态代码块不会被执行,因为静态的随着类的加载而加载,创建第一个对象时已经加载过类了,故第二次不再加载。

大概就这些啦,看一看执行结果跟分析一不一样吧
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值