最近去线下面试,以为直接和面试官去谈,结果拿出一张试卷,我一脸蒙蔽,不及格就没有办法和面试官去谈,结果、结果、结果..........后来你懂的,不然我也不会写下这篇文章。
首先来个总结,最后再来个总结首位呼应
最开始
如果没有父类对象:静态代码块
如果有继承父类:父类静态代码块-》子类静态代码块
new 对象();
首先如果是单类对象:代码块的执行顺序:普通块-》构造块
如果继承父类:父类普通块-》父类构造块-》子类普通块-》子类构造块
执行顺序:父类-》子类
总的流程:父静态块-》子静态块-》main方法-》父普通块-》父构造方法-》子普通块-》子构造方法
然后我们看看示例代码
1、代码演示目的说明:静态块->main方法->普通块->构造块
public class A {
//静态块>普通块>构造块
public A(){
System.out.println("A constructor ......");
}
static{
System.out.println("A static......");
}
{
System.out.println("A common......");
}
public static void main(String[] args) {
System.out.println("start......");
new A();
System.out.println("end......");
}
}
代码结果:
A static......
start......
A common......
A constructor ......
end......
2、代码演示结果目的说明:每次new对象的时候都会先执行普通块,然后执行构造块
public class A {
//静态块->普通块->构造块
public A(){
System.out.println("A constructor ......");
}
static{
System.out.println("A static......");
}
{
System.out.println("A common......");
}
public static void main(String[] args) {
System.out.println("start......");
//每次new对象都会先执行普通块,然后执行构造块
new A();
new A();
System.out.println("end......");
}
}
代码结果:
A static......
start......
A common......
A constructor ......
A common......
A constructor ......
end......
3、代码演示目的说明:多个同等级代码块的执行顺序取决于在代码中的顺序位置,从上到下
public class A {
//静态块->普通块->构造块
public A(){
System.out.println("A constructor ......");
}
static{
System.out.println("A static......");
}
static{
System.out.println("A also static......");
}
{
System.out.println("A also common......");
}
{
System.out.println("A common......");
}
public static void main(String[] args) {
System.out.println("start......");
new A();
new A();
System.out.println("end......");
}
}
代码结果:
A static......
A also static......
start......
A also common......
A common......
A constructor ......
A also common......
A common......
A constructor ......
end......
4、代码演示结果目的说明:继承有父类的对象的执行顺序:父类->子类
public class B extends A{
public B(){
System.out.println("B constructor ......");
}
static{
System.out.println("B static ......");
}
{
System.out.println("B common ......");
}
public static void main(String[] args) {
System.out.println("start");
new B();
System.out.println("end");
}
}
代码结果:
A static......
A also static......
B static ......
start
A also common......
A common......
A constructor ......
B common ......
B constructor ......
end
总结:静态块-》普通块-》构造块,父类-》子类,多个静态块会在程序初始化的时候去执行,多个普通块会在new对象的时候按照在代码中从上到下的顺序依次执行。
最开始
如果没有父类对象:静态代码块
如果有继承父类:父类静态代码块-》子类静态代码块
new 对象();
首先如果是单类对象:代码块的执行顺序:普通块-》构造块
如果继承父类:父类普通块-》父类构造块-》子类普通块-》子类构造块
执行顺序:父类-》子类
总的流程:父静态块-》子静态块-》main方法-》父普通块-》父构造方法-》子普通块-》子构造方法