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变量?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
如果按题目所说,那么
a = b这里就会报类型转换的错误。如果是这样的题目
那么参考以下:
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现在没有任何变量指向它,因此它会被当做辣鸡,从而被虚拟机回收
a和b都是引用。
把引用赋值给不同类型的引用会报类型转换错误。
把引用赋值给相同类型的引用,两个对象就指向同一片内存区域了。
对了。新手上路,仅供参考。
首先,Java的内存分为两种,一种是堆内存,一种是栈内存。
针对你给的例子比如
我们可以拆成两部分来解释:
所以a中其实存放的是A的地址。
同理b也存的你新new出来的B的地址,你执行了a=b的操作就是把b的值赋给了a(如果类型相同,或者存在继承)
现在a,b都指向了你new的B的地址。所以a.s的值是22。
PS:如果对象没有被引用了,那么就会被GC回收,当然了时间是不定的。可以考虑下哪块内存可能被回收。
下面的链接是我学习的时候收藏的。现在发在这里,希望能帮助你理解内存,侵权删除:
java中的各种数据类型在内存中存储的方式
以上有不恰当的地方还望指正,谢谢。