J2SE基础-程序运行顺序分析

ziliang 贡献于2011-02-27

作者 USER  创建于2009-11-13 12:49:00   修改者USER  修改于2009-11-13 14:31:00字数2736

文档摘要:
关键词:

import java.util.Calendar; public class Test { private static int i = 1; private static Test test = new Test(); public static final int CURRENT_YEAR=test(); public static int j = 2; public int result = 5; public Test(){ System.out.println(i); System.out.println(CURRENT_YEAR); System.out.println(j); result = CURRENT_YEAR-200; } public static int test() { System.out.println("test111"); return 3+4; } public static void main(String[] args) { System.out.println(test()); } } 当程序开始运行时,静态方法和静态变量已经在内存中被分配了空间,而实例方法只有在创建了该类的对象以后才分配内存。 那么当Test被加载,即当Test运行的时候,所有static的变量(i = 1,test = new Test(), CURRENT_YEAR = test(),j = 2)会依次被存储到data segment并分配空间,Static的方法 (test(),main()) 会被存放到code segment中并分配空间被存放在(此时其他方法代码还在内存中的代码块中并没有被存储到code segment中) 程序在code segment找到main()方法开始执行, 程序会对静态变量和字符串变量进行初始化,进入data segment中进行静态变量初始化。 进行静态变量初始化: 执行的过程中,程序会先执行 i = 1, 然后到 Test test = new Test(), 由于此时实例化了一个对象,程序会先对非静态变量result分配空间(分配到 heap)并进行初始化(此处为方便看出区别,让它初始化为5,如果不写赋值语句,将被初始化为缺省值0),同时将其他方法的代码放入code segment中并分配空间。然后程序会进入到构造方法进行执行,由于此时CURRENT_YEAR=test();和j=2;还没有被执行,但因为已经存在CURRENT_YEAR和 j的空间,但是没有进行赋值,那么java会将这2个int类型的数据初始化为缺省值0,所以构造方法中会依次输出 1 \n 0 \n 0 \n。 往下result = CURRENT_YEAR - 200; 执行之后result在heap中的内存块中的值被修改为 -200,result的值为-200。 往下执行到 CURRENT_YEAR=test(); 来到code segment中查找到test()方法中并执行,先输出 test1111 \n, 然后将 3+4 返回给 CURRENT_YEAR,所以此时CURRENT_YEAR的值为7。 程序往下执行, j = 2 data segment 中的语句执行完毕,程序会执行main()方法中的语句System.out.println(test()),程序将在code segment中查找到 test()方法,执行 test()方法中的语句,先输出 test1111 \n,然后将 3+4 返回。 最后程序将输出 7 \n main()方法执行完毕 程序运行完毕,程序退出 import java.util.Calendar; public class Test { private static int i = 1; private static Test test = new Test(); public static final int CURRENT_YEAR=Calendar.getInstance().get(Calendar.YEAR); public static int j = 2; int resul = 5; public Test(){ System.out.println(i); System.out.println(CURRENT_YEAR); System.out.println(j); result = CURRENT_YEAR-200; } public int getRsult() { return result; } public static void main(String[] args) { int i = 10; i = test.getRsult(); System.out.println(i); } } 那么对于此段代码,整体分析与上一段代码是差不多的。 程序运行的时候,静态变量被依次存放到data segment中并分配空间,静态方法被依次放到code segment并分配空间(此时其他方法代码还在内存中的代码块中并没有被存储到code segment中) 程序在code segment中查找到main()方法进行执行,然后对静态变量和字符串变量进行初始化。进入 data segment中执行 进行静态变量初始化: 执行的过程中,程序会先执行 i = 1, 然后到 Test test = new Test(), 由于此时实例化了一个对象,程序会先对非静态变量result分配空间(分配到 heap)并进行初始化(此处为方便看出区别,让它初始化为5,如果不写赋值语句,将被初始化为缺省值0),同时将其他方法的代码放入code segment中并分配空间。然后程序会进入到构造方法进行执行,由于此时CURRENT_YEAR=test();和j=2;还没有被执行,但因为已经存在CURRENT_YEAR和 j的空间,但是没有进行赋值,那么java会将这2个int类型的数据初始化为缺省值0,所以构造方法中会依次输出 1 \n 0 \n 0 \n。往下result = CURRENT_YEAR - 200; 执行之后result在heap中的内存块中的值被修改为 -200,result的值为-200。 往下执行到CURRENT_YEAR=Calendar.getInstance().get(Calendar.YEAR);程序会将获取到的年份返回,今年2009,返回2009.所以CURRENT_YEAR的值为2009 往下执行到 j = 2 data segment中的语句执行完毕,程序执行main()中的语句,首先 int i = 10,将会把局部变量i放入stack中并分配一块内存空间,值为10。往下 i = test.getRsult(); 程序会在code segment中查找到getRsult()方法,找到后执行getRsult()方法,将result返回,然后会改变变量i所指向的内存块值为result,i的值为-200。最后将i输出。输出为: -200 \n main()方法执行完毕 程序执行完毕,程序退出

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档