对象内存与方法调用机制

对象的内存布局

对象、字符串和数组都是引用类型,指向的数

我们以下面main方法部分代码片段为例: 

Cat cat = new Cat();
cat.name = "小白";
cat.age = 12;
cat.color = "白色";

首先执行mian方法,会在栈里创建一个独立的main栈空间(这里说成main栈是为了便于区分栈),在执行Cat cat = new Cat(),执行完后会在堆中产生一个对象空间,cat指向该对象空间,cat的基本类型age数据会直接存到堆信息中,由于name,color是字符串所以会在方法区中常量池在开创一个空间,用来存储他们的数据,此时堆中name与color指向该空间地址

注:当new一个对象时会加载Cat类的属性信息和行为(方法信息)

我们以下面代码为例:

Persion p1 = new Persion();
p1.age = 10;
p1.name = "小明";
Persion p2 = p1; //把p1赋给了p2,让p2指向p1
System.out.println(p2.age)

内存图:

当我们new一个p1对象时,在堆中会创建一个内存空间,此时p1指向创建好的内存空间,如果属性信息是引用类型则数据会存到方法区,而栈里面的该属性内存地址存放的就是具体数据的地址,在执行Persion p2 = p1,会p2直接指向p1指向的内存空间。

java内存结构分析:

1.栈:一般存放基本数据类型(局部变量)

2.堆:存放对象(Cat cat,数组等)

3.方法区:常量池(常量,比如字符串),类加载信息

方法调用机制

我们以一下面代码段为例:

Person p1 = new Persion();
int returnRes = p1.getSum(10,20);

//getSun(10,20)方法
public int getSum(int num1,int num2){
    int res = num1 +num2;
    return res;
}

首先main方法执行时,会在栈中创建一个main栈空间,在执行Person p1 = new Persion();执行完后会有一个对象空间产生,p1指向该对象空间,然后在执行int returnRes = p1.getSum(10,20);执行完后会在开一个栈空间(getSum栈独立空间,这里叫getSum栈便于区分栈空间),然后将10赋值给num1,将20赋值给num2,res就等于30,在执行return语句,将结果返回到int returnRes = p1.getSum(10,20)这个位置即返回给returnRes,当main方法结束后,整个程序退出(遵循栈的先进后出原则)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TC_FANCY

你的支持是我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值