java中的静态代码块、代码块、构造器的执行顺序是怎样呢,这三者有什么作用呢

2025-02-24 01:00:39
推荐回答(3个)
回答1:

先说执行顺序:我们在new一个对象时,如果类还没加载,就需要先将类加载到内存,此时就会执行静态代码块,在创建对象时,是先执行代码块,然后执行构造器。所以静态代码块、代码块、构造器的执行顺序是:静态代码块→代码块→构造器。

再说作用:静态代码块是用于初始化类的(在加载类时执行,只执行一次),代码块是用于初始化对象的(在创建对象时执行,每次创建对象时都执行),构造器是用于创建对象的。

回答2:

还是不得不拿出说事了。以下拿类T作为讲解的对象类型吧:
class T{
private static final String msg = "this is a test class!";
private static int version = 1;

static{

version = 2;
desc = "class T";
}
private static String desc = “T is a test Class”;

private int age = 2;
{
age = 10;
name = "panda";

}
public T(){

age = 12;
name = "foxli";
}
private String name = "micky";
}
类T,存在静态域version和desc,实例域age和name。
类中,存在静态代码块static{}以及实例化代码块{}和默认的构造方法。
------------------------------------------------------------------------------------------------------------
先来说一下类型初始化方法:
JVM通过Classload进行类型加载时,如果在加载时需要进行类型初始化操作时,则会调用类型的初始化方法。类型初始化方法主要是对static变量进行初始化操作,对static域和static代码块初始化的逻辑全部封装在方法中。
java.lang.Class.forName(String name, boolean initialize,ClassLoader loader),其中第二个参数就是是否需要初始化。
Java类型初始化过程中对static变量的初始化操作依赖于static域和static代码块的前后关系,static域与static代码块声明的位置关系会导致java编译器生成方法打字节码。
由上例子,T类型的类型初始化方法最后编译出来的字节码顺序大概是这样的:
T.{
private static int version;
private static String desc;
version = 1;
version = 2;
desc = "class T";
desc = "T is a test Class";
}
类型的初始化方法只在该类型被加载时才执行,且只执行一次。
-------------------------------------------------------------------------------------------------------------
接下来说一下对象实例化方法:
Java对象在被创建时,会进行实例化操作。该部分操作封装在方法中,并且子类的方法中会首先对父类方法的调用。
Java对象实例化过程中对实例域的初始化赋值操作全部在方法中进行,方法显式的调用父类的方法,实例域的声明以及实例初始化语句块同样的位置关系会影响编译器生成的方法的字节码顺序,方法以构造方法作为结束。
由上例子,T对象的对象实例化方法最后编译出来的字节码顺序大概是这样的:
T.{
int age;
String name;
this.age = 2;
this.age = 10;
this.name = "panda";
this.name = "micky";
this.age = 12;
this.name = "foxli";

}
对象实例化方法以构造方法作为结束。当前并没有考虑存在父类的情况,如果存在,方法首先会调用父类的方法。
-------------------------------------------------------------------------------------------------------------
PS:这里面的msg称为编译时常量,他不再方法中出现。
其中方法在javap命令中没有显示,javap输出的static{}就是方法。

回答3:

静态代码块->构造器->代码块