咋们话不多说,直接上代码
class A{
A(){
System.out.println("构造函数");
}
{
System.out.println("构造快");
}
static {
System.out.println("静态块");
}
}
运行试试,看看会打印出什么,哈哈
public class Demo {
public static void main(String[] args) {
A a = new A();
}
}
静态块
构造快
构造函数
看出来了吗?
静态块是跟随着类模板加载的,就像人的眼睛一样,人在哪里,必然眼睛就在哪里,所以第一个是静态块。而构造块是在构造函数运行时除super()方法外首先运行的。
如果是继承,结果会是什么呢?
class Parent{
static int time = 7;
Parent(){
System.out.println("Parent构造函数");
}
{
System.out.println("Parent构造快");
}
static {
System.out.println("Parent静态块");
}
}
class Sun extends Parent{
static int time1 = 7;
Sun(){
System.out.println("Sun构造函数");
}
{
System.out.println("Sun构造快");
}
static {
System.out.println("Sun静态块");
}
}
public class Demo {
public static void main(String[] args) {
Sun a = new Sun();
}
}
Parent静态块
Sun静态块
Parent构造快
Parent构造函数
Sun构造快
Sun构造函数
这是怎么回事呢?为啥和我们想象的不一样啊
这是因为生活中是先有父亲然后才有儿子,代码中也是一样的,当 new Sun() 的时候实例父亲对象已经存在,结合上面的总结,就可以得出答案。
执行顺序:
- 父类静态(不区分方法和字段,直接按照先后顺序)
- 子类的静态
- 父类的构造快
- 父类的构造方法
- 子类的构造快
- 子类的构造方法
现在你懂了吗
面试也会偶尔会问哦。。。。。