很多人不了解一个类中有静态代码块、匿名代码块、构造器,当创建一个类的对象的时候,这三个的执行顺序是怎么样的,下面就解决问题
public class Test{
public static void main(String [] args){
//创建对象
My my = new My();
}
}
//创建一个类,包含静态代码块、匿名代码块、构造器
class My{
//静态代码块
static {
System.out.println("静态代码块执行了");
}
//匿名代码块
{
System.out.println("匿名代码块执行了");
}
//无参构造方法
My(){
System.out.println("无参构造方法执行了");
}
}
//执行结果
静态代码块执行了
匿名代码块执行了
无参构造方法执行了
从执行结果可以看出执行顺是:静态代码块 => 匿名代码块 => 构造器
但是很多人可能不知道原因,那我阐述我的见解
原因
Java虚拟机先将类加载进内存,会经历加载->验证->准备->解析->初始化,在初始化阶段时,JVM会先将被static修饰的代码逐一执行,所以就会先执行静态代码块,而匿名代码块在创建对象的时候就会自动执行,并且在构造器之前执行
注意
静态代码块是类一加载就执行,永久只执行一次,JVM在加载类之前会检查该类是否被加载过,如果没有加载过,那么就对该类进行加载,同时会执行初始化静态变量、执行静态代码块,如果已经被加载了,那么就不会对该类进行加载,从而也不会初始化该类,当使用该类的时候,直接使用。
public class Test3{
public static void main(String [] args){
//创建了两个My对象
My my = new My();
My my1 = new My();
}
}
class My{
//静态代码块
static {
System.out.println("静态代码块执行了");
}
//匿名代码块
{
System.out.println("匿名代码块执行了");
}
My(){
System.out.println("无参构造方法执行了");
}
}
//输出结果
静态代码块执行了
匿名代码块执行了
无参构造方法执行了
匿名代码块执行了
无参构造方法执行了
通过以上可知,被static修饰会被逐一执行,那么就可知以下代码的执行的输出顺序
public class Test{
public static void main(String [] args){
My my = new My();
}
}
class My{
static int a = add(1,2);
//静态代码块
static {
System.out.println("静态代码块执行了");
}
//匿名代码块
{
System.out.println("匿名代码块执行了");
}
My(){
System.out.println("无参构造方法执行了");
}
public static int add(int a , int b){
System.out.println("调用了静态方法");
return a+b;
}
}
//输出结果
调用了静态方法
静态代码块执行了
匿名代码块执行了
无参构造方法执行了
你学会了吗?