内存分析—对象的实例化过程

来源:互联网 发布:淘宝上卖内衣的货源 编辑:程序博客网 时间:2024/05/17 13:42

package com.JAVABASIS6;
//菲佣类型,描述菲佣的状态,行为
class Servant{
String name;//姓名
int age;//年龄
int height;//身高
void cook(){
System.out.println(“做饭”);
}
void wash(){
System.out.println(“洗碗”);

}

}
public class ServantDemo {
public static void main(String[] args){
//给菲佣类创建一个对象s1
Servant s1 = new Servant(); //根据类来创建对象s1
s1.name = “小丽”; //给字段设置值
s1.age = 18; //给字段赋值
System.out.println(s1.name); //输出为小丽
System.out.println(s1.age ); //输出为18
//给菲佣类创建一个对象s2
Servant s2 = new Servant(); //根据类来创建对象s2
s2.name = “lili”; //给字段设置值
s2.age = 20; //给字段赋值
//给菲佣类创建一个对象s3
System.out.println(s2.name); //输出为lili
System.out.println(s2.age ); //输出为20
Servant s3 = new Servant(); //根据类来创建对象s3
s3.name = “lucy”; //给字段设置值
s3.age = 23; //给字段赋值
System.out.println(s3.name); //输出为lucy
System.out.println(s3.age ); //输出为23
}
}

内存引用分析

1.有方法一定有栈,有new一定有堆。方法区里面的ServantDemo.class和Servant.class代表着把这两个字节码的信息与方法放在方法区
2.如s1,在堆中占据一块引用地址为0x123里面有Svervant类中的方法及变量的空间,然后,将引用地址0x123赋给了s1,如果,给对象s1设定字段值,s1.name = “小丽”;那么name由原来的初始值为null改为小丽,输出结果为小丽
3.成员变量有初始值,如上述中的name初始值为null,age的初始值为0,局部变量没有初始值

这里写图片描述
假设s1 = null,那么会出现空指针异常,Null pointer access: The variable s1 can only be null at this location

public class ServantDemo {
public static void main(String[] args){
//给菲佣类创建一个对象s1
Servant s1 = new Servant(); //根据类来创建对象s1
s1 = null;
s1.name = “小丽”; //给字段设置值
s1.age = 18; //给字段赋值
System.out.println(s1.name); //输出为小丽
System.out.println(s1.age ); //输出为18

}

}

假设s2=s3,那么s2就不引用地址为0x456,转为引用s3所引用的地址0x789,所以s2的name是lucy,age为23

public class ServantDemo {
public static void main(String[] args){

//给菲佣类创建一个对象s2
Servant s2 = new Servant(); //根据类来创建对象s2
s2.name = “lili”; //给字段设置值
s2.age = 20; //给字段赋值
//给菲佣类创建一个对象s3
System.out.println(s2.name); //输出为lili
System.out.println(s2.age ); //输出为20
Servant s3 = new Servant(); //根据类来创建对象s3
s3.name = “lucy”; //给字段设置值
s3.age = 23; //给字段赋值
s2 = s3;
System.out.println(s3.name); //输出为lucy
System.out.println(s3.age ); //输出为23
System.out.println(s2.name+ “是s2 = s3”); //输出为lucy是s2 = s3
System.out.println(s2.age + “是s2 = s3” ); //输出为23是s2 = s3
}
}