永发信息网

java中对象作为方法的入参时,这个入参是否会在栈和堆中创建临时的对象

答案:4  悬赏:30  手机版
解决时间 2021-03-17 17:08
【代码】
class Demo
{
String temp = "hello" ;
}
public class RefDemo03
{
public static void main(String args[])
{ Demo d1 = new Demo() ;
d1.temp = "world" ;
System.out.println("fun()调用前:" + d1.temp) ;
fun(d1) ;
System.out.println("fun()调用:" + d1.temp) ;
}

public static void fun(Demo d2) //d2会不会在栈中创建对象,并在堆中分配内存给d2使用?
{
d2.temp = "JAVA";
}
}
【问题】
在栈中会不会创建对象d2,以及在堆中会不会额外分配内存给d2使用?
最佳答案
当new一个对象的时候,java在堆对对象分配内存,在栈中定义一个特殊的变量,这个变量的取值等于对象在堆内存中的首地址。

因此,单对象入参的时候,d2也是在栈中定义一个保存内存首地址的变量而已,这个地址指向原先在堆中被分配的内存。

因此,在方法中对对象的操作是直接操作原有的对象,而不会在堆中分配而外的内存。
也就是d1和d2指向的是同一个内存地址
全部回答
栈中会创建,堆中不会有,查看堆的地址可以直接打出来看看就知道~~ 再看看别人怎么说的。
当调用fun()函数式,会给形参d2赋值,此时会在栈中创建引用类型为Demo的d2,但是此时只是将d1所存储的内存地址复制给d2,即d1和d2指向同一内存地址,所以在堆中没有开辟新的内存空间,结果调用fun()函数后,d1.temp="java"
你可认为Java的方法参数只有传值,对于对象类型,传递的是引用的地址(或指针),因此在参数传递过程中不会创建任何对象。 堆里和栈里不会因参数传递放任何对象,最多是栈里放一些引用的地址。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
小鸡模拟器 逆转裁判4验证指纹的那个粉要怎么
如果不插座不接地,洗衣机外壳带电正常吗
河北二建还我血汗钱
奇异的游厉作文450字
乐逸茶楼在什么地方啊,我要过去处理事情
microsoft visual basic阶乘计算如何编程
狂野飙车8 1188bmw2经常匹配到1314 1234的蛇
在上海买何种车送牌照?
爸爸外遇了,要和妈妈离婚,我该怎么办?我该
被人无缘无故的打了,只构成轻微伤?我该怎么办
绅宝1.8T和2.0T的发动机有什么其别
东温泉热洞地址在哪,我要去那里办事
深汕高速哪个休息区有麦当劳?
泓瑞管材管件阀门地址有知道的么?有点事想过
有黄土高原到华北平原易引发的自然灾害
推荐资讯
马醉木的栽培技术
摩托罗拉z3手机发不了短信是为什么
人生的这趟旅行走走又停停
请问谁知道管道疏通机一般价位?
广州服装拿货网
PR CS5 怎么回归到最初界面 就是奥多比刚张装
宝贝之家孕婴童生活馆在哪里啊,我有事要去这
房道镇地籍办怎么去啊,有知道地址的么
有人用过永利八达通这个转运公司的吗
①如果一个几何体的三视图是完全相同的,则这
侠盗猎车手圣安地列斯我还有多久能去旧金山?
华安里社区有补汽车胎的吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?