当我们创建在一个类的时候,java在做那些事情,顺序是什么
<span style="font-size:14px;">public class text {
private int i=8;
private int k=9;
static int j=8;
static {
j=8;
System.out.println(j);
}
public text(int k){
this.k=k;
System.out.println("k:2");
System.out.println("2");
}
{
i1=9;
System.out.println("s");
// s="sss";//错误,因为没有s这个变量。
}
private int i1=6;
// {
// i1=9;
// System.out.println("s");
// }
public void printf(){
System.out.println(this.i1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
text t=new text(2);
t.printf();
text t1=new text(2);
t1.printf();
}
}
</span>
我们以这段代码来看,代码的执行结果如下
8
s
k:2
2
6
s
k:2
2
6
我们开启调试模式,一步步来看可以得出,当在第一次使用这个类来创建对象的时候,java还没有加载这个类,所以在一开始他是先加载这个类去执行这个类的初始化块,这个类的函数,创建类的对象,然后我们再根据这个类来创建对象。所以在一开始的时候。加载类-->创建类变量-->执行初始化代码块。
随后到了真正的创建对象。只要是创建对象,都是通过构造器来创建的。所以new 类()的时候,调试器跳到的第一句是对应的构造器,但是这个时候他只是在说我找到这个构造器了,并没有执行。随后java做了里面所有成员变量空间的创建,但是这个时候还没有赋值,执行的时候默认初始化,就是都是0。
随后开始执行代码块,这个时候我们说的初始化代码块,不仅仅是那些被{}在一起的代码块,前面的,对成员变量不通过构造器的赋值也是,所以我们可以认为他做了:
private int i;
{i=8;}的操作
所以这一部分是按照顺序执行的,所以我们会看到,要是我们把我们注释的那部分代码块解开注释,这个时候输出的就是:
2
9
在然后,才会执行构造器的东西。
然后再下一次的创建对象,因为类已经在加载过了,所以类的初始化块就不会再执行了