视频听得不大懂,即使懂了也怕记不住;还是码字出来验证下。呵呵
代码运行的顺序:
1)虚拟机加载主函数所在的类[方法区],如果有静态代码块则初始化//the Demo class is mounting!
2)JVM调用主函数【?主函数在内存的存放在哪里?】
3)主函数建立变量作为引用句柄p[栈内存]
4)JVM加载类[方法区],加载类中的static成员和方法到方法区
5)对类初始化(执行静态代码块)//the class is mounting!
6)堆内存开辟空间,分配地址,把地址给句柄【?是在对象属性初始化后把地址给句柄还是一分配地址后就给?】
7)建立对象的属性name,age[堆内存]
8)将对象的属性默认初始化
9)将对象的属性显示初始化
10)构造代码块初始化//the Object is creating!
11)构造函数初始化(一般函数不初始化,只在调用的时候执行),如构造函数有实参(局部变量)的话,在栈内存中建立变量,通过this引用到对象的属性(成员变量),更改值//name is age is
12)调用一般函数.
问题:
1.主函数先保存在方法区里了再执行么,还是不存直接调用?
2.建立对象的时候引用句柄赋值对象的堆内存的空间地址是什么时候?
3. 数据类型与数组的关系
private static String name = "unknown";// 像unkonwn这字符串的存储不是以数组的形式存成String类型么?如果是的话,怎么不写成 String[] name
HM汪磊 发表于 2013-3-7 23:24
关于第三个问题,不是以数组形式存储的,String s="unknow";
s是存储在栈里
new String("unknow");
String s= "unknown"
的顺序:
1.在常量池中搜索是否有字符串"unknown",如果没有就在编译时放入常量池的常量;
2.class文件被加载后,在栈空间建立变量s作为引用句柄
3.对s赋值“”unknown"的地址(对于基本类型应该不会用到常量池,因为基本类型的值就存在栈中,在Java中对基本类型变量的运算、判断以及赋值都是对值的操作,没有对地址操作,例如:int a = 1; int b = 2; a = b; 这是将b的值赋给a,而不是a引用b;)