本帖最后由 黑马朱超 于 2013-3-12 03:19 编辑
- class Person
- {
- private static String name = "unknown";//显示初始化变量name
- private int age ;// 私有化变量age
- private static String country = "CN";//静态变量country
- //静态代码块
- static
- {
- System.out.println("the class"+"is mounting!");
- }
- //构造代码块
- {
- System.out.println("the object"+" is creating!");
- }
- Person()//构造函数
- {
- speak();
- }
- //构造函数
- Person(String name,int age)//构造函数把属性指向对象
- {
- this.name =name;
- this.age= age;
- speak();
- }
- //对对象修改属性
- public void setName(String name)
- {
- this.name = name;
- }
- //打印名称,年龄
- public void speak()
- {
- System.out.println("name is "+name+";age is"+age);
- }
- //打印静态变量country
- public static void showCountry()
- {
- System.out.println("country is"+country);
- }
- }
- class PersonDemo2
- {
- //主函数所在类中的静态代码块
- static
- {
- System.out.println("the Demo class "+"is mounting!");
- }
- public static void main(String [] args)
- {
- Person.showCountry();//因为showCountry是静态的,可以直接打印;需要加类名
- new Person();//创建Person类匿名对象
- Person p = new Person("lian",20);//创建Person类对象,创建时赋值
- p.showCountry();//对象调用静态函数
- p.setName("lili");//对对象进行重新改名
- p.speak();//调用speak
- }
- }
复制代码
视频听得不大懂,即使懂了也怕记不住;还是码字出来验证下。呵呵
代码运行的顺序:
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
|