先说执行顺序:我们在new一个对象时,如果类还没加载,就需要先将类加载到内存,此时就会执行静态代码块,在创建对象时,是先执行代码块,然后执行构造器。所以静态代码块、代码块、构造器的执行顺序是:静态代码块→代码块→构造器。
再说作用:静态代码块是用于初始化类的(在加载类时执行,只执行一次),代码块是用于初始化对象的(在创建对象时执行,每次创建对象时都执行),构造器是用于创建对象的。
还是不得不拿出
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称为编译时常量,他不再
其中
静态代码块->构造器->代码块