引用对象在java中是如何工作的

引用对象在java中是如何工作的,java,object,Java,Object,有人能让我明白吗?参考对象在java中如何工作从下面的代码我有objectr1和reference objectr2, Rectangle r1=新矩形();矩形r2=r1 当我同时打印r1和r2时,输出是这样的Rectangle@17f7bec4(两者的输出相同)。好的,我知道这是内存地址,对吗?如果我打印下面的代码 r1.length = 50; r2.length = 20; System.out.println("Value of R1's Length : " + r1.

有人能让我明白吗?参考对象在java中如何工作从下面的代码我有object
r1
和reference object
r2
Rectangle r1=新矩形();矩形r2=r1
当我同时打印
r1
r2
时,输出是这样的
Rectangle@17f7bec4
(两者的输出相同)。好的,我知道这是内存地址,对吗?如果我打印下面的代码

  r1.length = 50;
  r2.length = 20;

  System.out.println("Value of R1's Length : " + r1.length);
  System.out.println("Value of R2's Length : " + r2.length);
  Rectangle r1 = new Rectangle();
  Rectangle r2 = r1;
  r2 = null;

 System.out.println("R1 : " + r1);
 System.out.println("R2 : " + r2);
上述代码的输出为:

R1长度值:20

R2的长度值:20

我无法理解此输出为什么两者都有
20
值? 如果这是因为引用内存,那么当我使用下面的代码时

  r1.length = 50;
  r2.length = 20;

  System.out.println("Value of R1's Length : " + r1.length);
  System.out.println("Value of R2's Length : " + r2.length);
  Rectangle r1 = new Rectangle();
  Rectangle r2 = r1;
  r2 = null;

 System.out.println("R1 : " + r1);
 System.out.println("R2 : " + r2);
两个对象的输出:

R1:
Rectangle@17f7bec4

R2:null

为什么r1没有
null
值?这就是让我困惑的点 下面是正在运行的代码

class Rectangle {
  double length;
  double breadth;
}

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

  Rectangle r1 = new Rectangle();
  Rectangle r2 = r1;

r1.length = 50;
r2.length = 20;


  System.out.println("R1 : " + r1);
  System.out.println("Value of R1's Length : " + r1.length);
  System.out.println("Value of R2's Length : " + r2.length);
r2 = null;
  System.out.println("R2 : " + r2);

  }
}

r1
r2
是对对象的引用。在第一种情况下,它们都指向同一个对象,在第二种情况下,
r2
指向
null
。在代码中只有一个非空对象和两个引用


对代码的注释

Rectangle r1 = new Rectangle();    //object creation, make r1 point to created object
Rectangle r2 = r1;                 //r2 now points to the same object, that was created a line above

r1.length = 50;    //change lenght of object r1 points to
r2.length = 20;    //change lenght of object r2 points to (the same object as r1 points to)

r2 = null; //make r2 point to null

r1
r2
是对对象的引用。在第一种情况下,它们都指向同一个对象,在第二种情况下,
r2
指向
null
。在代码中只有一个非空对象和两个引用


对代码的注释

Rectangle r1 = new Rectangle();    //object creation, make r1 point to created object
Rectangle r2 = r1;                 //r2 now points to the same object, that was created a line above

r1.length = 50;    //change lenght of object r1 points to
r2.length = 20;    //change lenght of object r2 points to (the same object as r1 points to)

r2 = null; //make r2 point to null

对象是在堆中创建的,它有一个地址

Rectangle r1 = new Rectangle();
// r1 is pointing to that address
Rectangle r2 = r1;
// now r2 is pointing to the same address (same object) with r1
r2 = null;
// now r2 is null, but the object is still in the heap.
// r2 doesn't point to that object anymore.

您的对象是在堆中创建的,它有一个地址

Rectangle r1 = new Rectangle();
// r1 is pointing to that address
Rectangle r2 = r1;
// now r2 is pointing to the same address (same object) with r1
r2 = null;
// now r2 is null, but the object is still in the heap.
// r2 doesn't point to that object anymore.

它对任何语言都是一样的

Rectangle r1 = new Rectangle(); //r1 refers to this new Rectangle
Rectangle r2 = r1; //now r2 refers to the same Rectangle r1 refers to
r2 = null; //now is referring to null
您可以将r1设置为null,它将具有相同的行为

如果将r2更改为最终版本,则不允许更改

Rectangle r1 = new Rectangle();
final Rectangle r2 = r1; //now r2 will be forever referring to the Rectangle above even if you change r1 to null
检查一下,如果你把r1改为null,r2仍然会指向矩形。。。当你告诉r2=r1时。。。r2不是指向r1,r2实际上是指向矩形本身

Rectangle r1 = new Rectangle(2, 2);
final Rectangle r2 = r1; // now r2 will be forever referring to the
             // Rectangle above even if you change r1 to
             // null
r1 = null;
System.out.print(r2.getWidth());

输出宽度仍然为2,并且没有空错误。

对于任何语言,其工作方式相同

Rectangle r1 = new Rectangle(); //r1 refers to this new Rectangle
Rectangle r2 = r1; //now r2 refers to the same Rectangle r1 refers to
r2 = null; //now is referring to null
您可以将r1设置为null,它将具有相同的行为

如果将r2更改为最终版本,则不允许更改

Rectangle r1 = new Rectangle();
final Rectangle r2 = r1; //now r2 will be forever referring to the Rectangle above even if you change r1 to null
检查一下,如果你把r1改为null,r2仍然会指向矩形。。。当你告诉r2=r1时。。。r2不是指向r1,r2实际上是指向矩形本身

Rectangle r1 = new Rectangle(2, 2);
final Rectangle r2 = r1; // now r2 will be forever referring to the
             // Rectangle above even if you change r1 to
             // null
r1 = null;
System.out.print(r2.getWidth());

输出宽度仍然为2且没有空错误。

//现在r2为空,但对象仍在堆中。
确定!但当我将20赋给r2(r2.length=20;)时,为什么两者的值相同?对象仍在堆中将对象的长度设置为20后,您将r2分配给null。
//现在r2为null,但对象仍在堆中。确定!但当我将20赋给r2(r2.length=20;)时,为什么两者的值相同?在将对象的长度设置为20后,对象仍在您指定的r2为null的堆中