对象内存分布

在main中new一个对象后的内存变化

  • 一个手机类Phone,在main中实例化一个对象One
    • 方法区存放类信息,包括main、Phone
    • 在main中 Phone one = new Phone(); ,其中堆区开辟一块空间来存放new对象的内容,其地址为0x666,内容包括成员变量的值以及成员方法在方法区的首地址0x333。在栈区仅存放该对象在堆区的首地址0x666。
    • one.brand = "苹果" 根据0x666找到在堆区的位置,并查询到成员变量,修改内容
    • one.call("乔布斯") 根据0x666找到在堆区的位置,并查到成员方法在方法区的地址0x333。该方法入栈执行。之后出栈,开始执行 one.sendMessage();

对象作为方法参数

  • 对象作为方法中的参数时,传递的是对象在堆区的地址
    • one 在栈区的地址为0x666,执行method(one) 时,传入了0x666这个地址,在方法体内,使用这个地址到堆区查找修改。

对象作为返回值

  • 对象作为返回值传递的也是在堆区开辟的空间的地址
    • Phone two = getPhone(); getPhone方法入栈,在方法中新建了一个对象one,在堆区的地址是0x666,最后返回这个地址,赋值给two。