题目内容就是搞清楚下面程序之间执行的顺序:
/*
* 代码块的面试题
*
* 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类中执行顺序大家肯定都知道,静态代码块随着类的加载而加载。
- 故在主函数中创建对象时Coder会被加载,就会先加载静态代码块;
- 接下来创建对象会调用构造方法,但在构造方法加载前,会执行构造方法的共性—构造代码块;
- 构造代码块执行完后会执行无参构造方法。
但接下来我们深入分析,看一个进阶版的代码:
/*
* 代码块的面试题
*
* 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无参空构造执行");
}
}
现在程序顺序就变得不那么清晰了,我们来简单分析一下:
- 程序执行入口为主方法,故执行程序会先加载Day12_1类;
- 静态代码块随着类的加载而加载,首先输出“Day12_1静态代码块执行”;
- 进入主函数,会输出“Day12_1的主函数执行了”;
- 接下来创建Coder对象,创建第一个对象的执行顺序为“Coder静态代码块执行—Coder构造代码块执行—Coder无参空构造执行” (详细分析看上面);
- 但创建第二个Coder对象和第一个有一点不同,此时静态代码块不会被执行,因为静态的随着类的加载而加载,创建第一个对象时已经加载过类了,故第二次不再加载。
大概就这些啦,看一看执行结果跟分析一不一样吧