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

本文通过分析Java代码展示了对象实例化的全过程,包括堆和栈内存的分配,成员变量的初始化,以及对象引用的变化。讨论了null引用赋值、对象复制等场景对内存的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值