天天看点

Java中将一个对象赋给另一个对象时会发生什么?

#Java中将一个对象赋给另一个对象时会发生什么?

本文通过一个例子来说明java对象的引用机制:

class Computer {
//电脑中的齿轮直径:diameter of a cog in a computer 
float cogDiameter; 
}

public class AssignmentTest {
public static void main(String[] args) {

    // create two computers
    Computer com1 = new Computer();
    Computer com2 = new Computer();
    // first, assign values to com1 and com2
    com1.cogDiameter = 1;
    com2.cogDiameter = 2;
    System.out.println("1:"+"com1.cogDiameter:"+com1.cogDiameter+"  "+"com2.cogDiameter:"+com2.cogDiameter);

    //assign com1 to com2
    com2 = com1;
    System.out.println("2:"+"com1.cogDiameter:"+com1.cogDiameter+"  "+"com2.cogDiameter:"+com2.cogDiameter);

    //change the cogDiameter of com1
    com1.cogDiameter = 6;
    System.out.println("3:"+"com1.cogDiameter:"+com1.cogDiameter+"  "+"com2.cogDiameter:"+com2.cogDiameter);

    }
}
           
  • 创建一个Computer(电脑)类
  • 这个类包含一个field,也就是float类型的cogDiameter(齿轮直径)
  • 再创建一个AssignmentTest类,用来测试java中将一个对象赋给另一个对象时会发生什么
  • 先创建两个computer对象,分别命名为com1 和 com2
  • 为这两个对象的cogDiameter分别赋值为1和2
  • 第一次输出com1和com2的cogDiameter
  • 然后将com1赋给com2, 注意此时是将对象赋给对象
  • 那么实际系统的工作机制是什么呢?
  • com1和com2这两个名称其实都只是存在于栈内存中的引用,它们只是指向堆内存中的真正的com1和com2对象,而这两个对象的field其实也保存在堆内存中,所以把com1赋给com2的意思就是:把com1的引用赋给com2,这样一来其实com2实际指向的也是com1了
  • 这个时候再输出一次com1和com2各自的cogDiameter就会发现结果有点“出人意料”了
  • 同样地,再改变com1的cogDiameter的值就会发现com2也会受到影响,这也是因为com2真正指向的是com1在堆内存中的对象

Output(输出):

1:com1.cogDiameter:1.0 com2.cogDiameter:2.0

2:com1.cogDiameter:1.0 com2.cogDiameter:1.0

3:com1.cogDiameter:6.0 com2.cogDiameter:6.0