JVM 之对象构造机制
?
?
一直想写点东西,但是不知道从哪里下手,想来想去,我们搞Java的,还是从jvm,从Java基础上说起吧。言归正传,先上代码,后分析!
?
?
public class Person {
static{
System.out.println("Person 静态块");
}
public Person(){
System.out.println("Person 构造函数");
}
}
?
?
public class Teacher {
?
public Teacher(){
System.out.println("Teacher 构造函数");
}
public Teacher(String name){
System.out.println("Teacher 构造函数+++" + name);
}
}
?
?
?
运行结果:大家可以先试一遍再运行
?
?
Test 静态块
Test 非静态块
Test 构造函数
------------1-------------
Person 静态块
Teacher 构造函数+++李四
Student 静态块1
Student 静态块2
Studeng 静态方法
------------2-------------
Person 构造函数
Teacher 构造函数
Student 非静态块1
Student 非静态块2
Student 构造函数
------------3-------------
?
?
?
那么,现在解析一下。从运行结果1,我们得到类加载顺序:
静态块>非静态块>构造函数
从运行结果2,我们得到类加载顺序:
静态块(包括 static区和静态变量)>非静态块(包括 初始化区和实例变量)>构造函数。当有多个static区或者静态变量时,按代码的先后顺序进行加载,且只加载一次;非静态块与静态块加载顺序规则相同;
构造函数,只有当实例化类时(new),才会加载
从运行结果3和运行结果2得到的类加载顺序是:
在2的结果下,父类加载顺序>子类加载顺序
?
程序运行过程是:
1、在Test类中,首先加载static区、初始化区、构造函数,执行main方法
2、到达Student.test(),开始加载Student类,发现Student类有父类Person,先不加载Student,开始加载Person类,加载Person类的static区;返回加载Student,开始加载静态区(包括静态变量和static区),按代码的先后顺序,进行加载;执行静态方法test()
3、Student?s = new Student(),实例化Student,因为Student类有父类Person,所以先加载Person的构造函数(静态块只加载一次,在过程2中都加载过了);返回加载Student,(静态块加载过了)加载非静态块,按代码的先后顺序,进行加载;加载Student构造函数
4、mian方法执行完毕
?
?
没有区分开类加载机制和对象构造机制,谢谢指点mfkvfn 写道。。。 3 楼 tovep 2012-02-13 mfkvfn 写道。。。