首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JVM 之对象结构机制

2012-08-31 
JVM 之对象构造机制??一直想写点东西,但是不知道从哪里下手,想来想去,我们搞Java的,还是从jvm,从Java基础

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);

}

}


?


public class Student extends Person {private Teacher t1 = new Teacher();private static Teacher t2 = new Teacher("李四");static {System.out.println("Student 静态块1");}
{System.out.println("Student 非静态块1");}{System.out.println("Student 非静态块2");}
static {System.out.println("Student 静态块2");}
public Student() {System.out.println("Student 构造函数");}
public static void test() {System.out.println("Studeng 静态方法");}}

public class Test {public Test() {System.out.println("Test 构造函数");}
static {System.out.println("Test 静态块");}
{System.out.println("Test 非静态块");}
public static void main(String[] args) {Test t = new Test();t.startTest();}
public void startTest() {System.out.println("------------1-------------");Student.test();System.out.println("------------2-------------");Student?s = new Student();System.out.println("------------3-------------");}}

?

?

运行结果:大家可以先试一遍再运行JVM 之对象结构机制

?

?

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 写道。。。
这哪里是类加载机制。只是对象构造机制而已。
静态static的构造机制...

热点排行