今天去面试了一家公司,做了一套题,其中有一道题自己感觉知识点并没有掌握,所以面试回来后自己手写了一下,发现笔试题全写错了!
代码如下
class A {
public A(){
System.out.println("A 构造器!");
}
{System.out.println("A 构造代码块!");}
static{
System.out.println("A 静态代码块!");
}
}
public class B extends A{
public B(){
System.out.println("B 构造器!");
}
{System.out.println("B 构造代码块!");}
static{
System.out.println("B 静态代码块!");
}
public static void main(String[] args){
B b1 = new B();
B b2 = new B();
}
}
代码的执行结果为:
A 静态代码块!
B 静态代码块!
A 构造代码块!
A 构造器!
B 构造代码块!
B 构造器!
A 构造代码块!
A 构造器!
B 构造代码块!
B 构造器
第一次执行的顺序为父类静态代码块>子类静态代码块>父类构造代码块>父类构造器>子类构造代码块>子类构造器;
第二次执行顺序为父类构造代码块>父类构造器>子类构造代码块>子类构造器;
因为静态代码块只加载一次,之后就不再继续加载,原因为:静态代码块是属于整个类的,并不是属于某个对象的,所以只加载一次;而构造代码块和构造方法是属于对象的,每次new一个对象就会被重新实例化一次,且构造代码块的执行顺序先于构造方法,原因为构造代码块初始化的是给所有对象初始化,而构造器是初始化对应的对象。
看来还是需要加强基础啊。
参考文章:https://blog.csdn.net/xingzhemoluo/article/details/39997325