静态代码块,构造代码块和构造函数的区别
1.执行顺序:静态代码块>构造代码块>构造方法
理由:静态代码块(static {} )在类加载的时候执行一次。
构造代码块({}内的部分)在每次创建对象时执行,始终在构造方法前执行。
构造方法在新建对象时调用( 就是新的时候 )。
注意:一个静态代码块在类加载的时候就执行,所以的它优先级高于入口main()的方法。
湾当三种形式不止一次出现,同优先级是按照先后顺序执行。
2.现在来看下有继承时的情况:
[java] view plain copy
public class HelloB extends HelloA {
//<span style="white-space:pre;"> </span>static HelloB hB = new HelloB();
public HelloB(){
System.out.println("B的构造方法");
}
{
System.out.println("B的构造代码块");
}
// public static HelloB hB = new HelloB();
static{
System.out.println("B的静态代码块");
}
// public static HelloB hB = new HelloB();
public static void main(String[] args){
new HelloB();//调用B的构造方法
}
}
class HelloA{
public HelloA(){
System.out.println("A的构造方法");
}
{
System.out.println("A的构造代码块");
}
static{
System.out.println("A的静态代码块");
}
}
输出结果为:
A的静态代码块
B的静态代码块
A的构造代码块
A的构造方法
B的构造代码块
B的构造方法
可以看出:
一个。父类始终先调用(继承先调用父类),并且这三者之间的相对顺序始终保持不变
静态湾因为代码块在类加载时执行,所以先输出的是父类和子类的静态代码块
调用角乙构造的方法创建对象时,构造块状语从句:构造方法会一起按顺序执行,还是父类的先调用
以上看下来貌似没什么问题,但看接下来一道阿里笔试题:
[java] view plain copy
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static B t1 = new B();
public static void main(String[] args)
{
B t =new B();
}
}
显示结果为:
构造块 构造块 静态块 构造块
为什么不是:
静态块 构造块 构造块 构造块
原因:
静态块:用静态申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>主()>构造块>构造方法
因为静缘故T1,T2也上升到静态位,与静态块处于同一优先级,同一优先级就先取按顺序来构造对象,构造对象,静态块
public static HelloB hB = new HelloB();
是在创建对象,创建对象执行构造块,输出---构造块
接下来还是
public static HelloB hB = new HelloB();
输出----构造块
接下来静态块,输出------静态块
接下来主中,创建对象,对象为非静态的,所以先静态块,再构造对象,由于静态块只在加载时执行一次,
所以接下来只输出---构造块
注:
第一段代码补充:如果在B的静态代码块之前加一句:
static HelloB hB = new HelloB();
静态代码块会在其执行创建对象(执行构造块)完后再执行,结果如下:
A的静态代码块
A的构造代码块
A的构造方法
B的构造代码块
B的构造方法
B的静态代码块
A的构造代码块
A的构造方法
B的构造代码块
B的构造方法
如果加在之后,则会先执行,说明优先级相同时是按照先后顺序执行的,结果如下:
A的静态代码块
B的静态代码块
A的构造代码块
A的构造方法
B的构造代码块
B的构造方法
A的构造代码块
A的构造方法
B的构造代码块
B的构造方法
转载:https://blog.csdn.net/qq_39269985/article/details/80357929

浙公网安备 33010602011771号