在java中,我们可以在更多引用变量中引用一个对象。但我们不能将它用于原始数据类型而不使用静态但它更加不同。
下面,
Rectangle r1 = new Rectangle(0, 0, 100, 50);
System.out.println(r1);
Rectangle r2 = r1;
r2.grow(10, 20);
System.out.println(r1);
System.out.println(r2);
在原语中相同,
double n1 = 150;
double n2 = n1;
n2 = n2 * 20;
System.out.println(n1);
System.out.println(n2);
但行为不同。我知道那是不同的但我需要知道为什么?什么东西在记忆中?
答案 0 :(得分:3)
变量直接包含值。在基元的情况下,值是基元。在对象引用的情况下,值是引用,而不是对象。
在图片中:
int a = 5;
给我们
+-----+ | a | +-----+ | 5 | +-----+
但
Foo f = new Foo();
给我们
+-----+ | f | +-----+ +--------------+ | ref |-------------->| A Foo object | +-----+ +--------------+
由于f
所持有的值是引用,因此将引用到内存中的其他位置。
每当您将一个变量分配给另一个变量(或将变量的值传递给函数)时,您复制该变量所持有的值。因此,如果我们如上所述a
和f
并执行此操作:
int b = a;
现在我们有了
+-----+ | a | +-----+ | 5 | +-----+ +-----+ | b | +-----+ | 5 | +-----+
a
中的值已复制到b
。
现在假设我们这样做:
Foo f2 = f;
请记住,f
包含的是引用,而不是对象。所以我们得到了这个:
+-----+ | f | +-----+ | ref |-------+ +-----+ | | +--------------+ +-----+ +-------| A Foo object | | f2 | | +--------------+ +-----+ | | ref |-------+ +-----+
f
中的值已复制到f2
,但该值是引用,因此f
和f2
将引用到内存中其他位置的同一对象。
答案 1 :(得分:1)
案例是,对于原语,您始终为值赋值,对于对象引用值。
int a = 10; //Assign to variable a value of 10
int b = a; //Assigne to variable b value that is under adress of a
Object A = new Object(); // Create instance of class Object and assigne the reference to variable A;
Object B = A; // Assign the reference to B of object under adress A;
要了解有关该概念的更多信息,请按照this link
进行操作答案 2 :(得分:1)
(1)Rectangle r1 = new Rectangle(0,0,100,50);
(2)矩形r2 = r1;
(3)r2.grow(10,20);
然后更改变量,此更改也会显示在r1
中