素材牛VIP会员
java中对象a = 对象b,这是一个什么样的过程
 be***ai  分类:Java代码  人气:1457  回帖:3  发布于6年前 收藏
A a = new A();
a.s = 11;
B b = new B();
b.s = 22;
a = b;//这段代码的过程
System.out.println(a.s);

类A和类B都有一个成员变量s,实例化出来的两个对象 a,b。
a = b; 这是一个什么样的过程?
如果调用a.s 会是哪个类的s变量?

 标签:java

讨论这个帖子(3)垃圾回帖将一律封号处理……

Lv3 码奴
上***水 职业无 6年前#1

首先,Java的内存分为两种,一种是堆内存,一种是栈内存。
针对你给的例子比如

A a = new A();

我们可以拆成两部分来解释:

A a = null;//在栈中创建一个变量,但是内容为空没有指向
a = new A();//在堆中创建一个对象,并将地址赋值给a 

所以a中其实存放的是A的地址。
同理b也存的你新new出来的B的地址,你执行了a=b的操作就是把b的值赋给了a(如果类型相同,或者存在继承)
现在a,b都指向了你new的B的地址。所以a.s的值是22。

PS:如果对象没有被引用了,那么就会被GC回收,当然了时间是不定的。可以考虑下哪块内存可能被回收。
下面的链接是我学习的时候收藏的。现在发在这里,希望能帮助你理解内存,侵权删除:
java中的各种数据类型在内存中存储的方式

以上有不恰当的地方还望指正,谢谢。

Lv4 码徒
錯***來 JS工程师 6年前#2

a和b都是引用。
把引用赋值给不同类型的引用会报类型转换错误。
把引用赋值给相同类型的引用,两个对象就指向同一片内存区域了。

对了。新手上路,仅供参考。

Lv6 码匠
zc***78 软件测试工程师 6年前#3

如果按题目所说,那么a = b这里就会报类型转换的错误。

如果是这样的题目

A a = new A();
a.s = 11;
A b = new A();
b.s = 22;
a = b;//这段代码的过程
System.out.println(a.s);

那么参考以下:

new A(); 在内存中开辟一块内存空间mem-A,用来存放对象的数据
A a = new A(); 内存中有一个a变量,这个变量的值是mem-A的内存地址,换言之,a是一个指针,指向mem-A
同理, B b = new B();参考上面。

此时,a 指向 mem-A, b指向 mem-B
a = b;, 把a这个变量的值修改为b的值,即a变量现在存的是mem-B的内存地址,换言之,a这个指针现在已经不指向mem-A了,而是和b一样,指向了mem-B。

所以调用a.s,实际上等同于调用b.s

BTW,mem-A现在没有任何变量指向它,因此它会被当做辣鸡,从而被虚拟机回收

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取