Java中对象赋值(如course2 = course1)的原理及执行机制咨询
关于Java对象赋值的常见疑问解答
咱们把你的问题拆成两部分,一步步讲明白:
1. Instance A = Instance B 具体执行什么操作?
在Java里,所有对象类型的变量(比如你定义的Course对象)存的不是对象本身,而是指向对象内存位置的引用(可以理解为内存地址)。当你执行Instance A = Instance B时,本质是把B变量里保存的引用地址,拷贝一份赋值给A变量。
这时候,A和B就会指向同一个对象实例——不管你通过A还是B修改对象的属性,另一个变量访问到的结果都会跟着变,因为它们操作的是内存里同一个东西。
2. 代码中course2 = course1时发生了什么?
结合你给出的代码片段,咱们还原完整场景来解释:
假设你的main方法完整代码大概是这样(补全你没写完的部分):
public static void main(String[] args) { Course course1 = new Course(2531, "Programming Fundamentals"); Course course2 = new Course(1001, "Programming Fundamentals"); // 你初始化的第二个对象 course2 = course1; // 这句是疑问核心 System.out.println(course1.getName()); System.out.println(course2.getName()); course1.setName("Java Advanced"); System.out.println(course1.getName()); System.out.println(course2.getName()); }
执行course2 = course1的本质:
- 执行这句之前,
course1和course2各自指向内存中两个独立的Course对象; - 执行这句之后,
course2原来指向的那个对象会被“抛弃”(后续会被Java垃圾回收机制清理),转而和course1指向同一个对象。这时候你通过course1.setName(...)修改名字,course2.getName()也会输出新名字,因为它们操作的是同一个对象。
注释掉这句后的现象解释:
如果把course2 = course1注释掉,course1和course2就一直是两个完全独立的对象。如果你的course2初始化时courseName也是"Programming Fundamentals",那前两次输出自然都是这个字符串。后续如果你只修改course1的名字,course2的名字不会变——因为它们是内存里两个分开的对象,互相不影响。
内容的提问来源于stack exchange,提问作者N Woods
相关产品推荐
相关产品推荐

