2013-10-28 22 views
-1

在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); 

但作用不同。我知道这是不同的,但我需要知道,为什么?内存中发生了什么?

+4

虽然我真的已经很努力,我无法理解发生了什么,你写的。 –

+0

你的记忆被抹去了。哦,等一下? –

+0

我觉得他的说法,当你改变R2,R1的变化,但是当你改变N2,N1保持不变......但他应该写输出。确实如此。 – luanjot

回答

3

变量直接包含。在原语的情况下,值是原始的。在对象引用的情况下,该值是引用,而不是对象。

在图片:

int a = 5; 

给我们

+-----+ 
| a | 
+-----+ 
| 5 | 
+-----+

Foo f = new Foo(); 

给我们

+-----+ 
| f | 
+-----+    +--------------+ 
| ref |-------------->| A Foo object | 
+-----+    +--------------+

由于f所保存的值是参考,因此它指向内存中其他位置。

无论您何时将一个变量分配给另一个变量(或将变量值传递给函数),您都会将该变量所保存的值复制到。因此,如果我们有af如上并做到这一点:

int b = a; 

现在我们有

+-----+ 
| a | 
+-----+ 
| 5 | 
+-----+ 

+-----+ 
| b | 
+-----+ 
| 5 | 
+-----+

价值a被复制到b

现在假设我们这样做:

Foo f2 = f; 

记住什么f持有是参考,而不是对象。因此,我们得到这个:

+-----+ 
| f | 
+-----+ 
| ref |-------+ 
+-----+  | 
       |  +--------------+ 
+-----+  +-------| A Foo object | 
| f2 |  |  +--------------+ 
+-----+  | 
| ref |-------+ 
+-----+

f被复制到f2,但该值的引用,这样既ff2在内存中是指同一个对象的其他地方。

+0

对我来说很好的解释。谢谢.. :) – CodeSac

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

+0

谢谢你.. :) – CodeSac

1

(1)矩形R1 =新的Rectangle(0,0,100,50);

  • 创建矩形类的对象

(2)矩形R2 = R1;

  • 保持在R2中的对象引用

(3)r2.grow(10,20);

它改变可变然后,这种变化也显示在R1

相关问题