永发信息网

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

答案:4  悬赏:30  手机版
解决时间 2021-03-17 17:08
  • 提问者网友:龅牙恐龙妹
  • 2021-03-17 03:10
【代码】
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使用?
最佳答案
  • 五星知识达人网友:白昼之月
  • 2021-03-17 03:51
当new一个对象的时候,java在堆对对象分配内存,在栈中定义一个特殊的变量,这个变量的取值等于对象在堆内存中的首地址。

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

因此,在方法中对对象的操作是直接操作原有的对象,而不会在堆中分配而外的内存。
也就是d1和d2指向的是同一个内存地址
全部回答
  • 1楼网友:痴妹与他
  • 2021-03-17 07:14
栈中会创建,堆中不会有,查看堆的地址可以直接打出来看看就知道~~ 再看看别人怎么说的。
  • 2楼网友:妄饮晩冬酒
  • 2021-03-17 06:14
当调用fun()函数式,会给形参d2赋值,此时会在栈中创建引用类型为Demo的d2,但是此时只是将d1所存储的内存地址复制给d2,即d1和d2指向同一内存地址,所以在堆中没有开辟新的内存空间,结果调用fun()函数后,d1.temp="java"
  • 3楼网友:孤独入客枕
  • 2021-03-17 04:55
你可认为Java的方法参数只有传值,对于对象类型,传递的是引用的地址(或指针),因此在参数传递过程中不会创建任何对象。 堆里和栈里不会因参数传递放任何对象,最多是栈里放一些引用的地址。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯