引用对象在java中是如何工作的
有人能让我明白吗?参考对象在java中如何工作从下面的代码我有object引用对象在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.
r1
和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.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的堆中