java将一个基本变量分配给另一个,而将引用变量分配给另一个
我想了解原语和对象引用变量的行为是如何不同的。我使用了Kathy Sierra的OCA/OCP Java SE7中的以下代码作为示例:
public class VariableTesting {
public static void main(String[] args) {
int a = 10;
System.out.println("a= " + a);
int b = a;
b = 30;
System.out.println("a= " + a + " after change it to b and b is " + b);
Dimension a1 = new Dimension(5, 10);
System.out.println("a1.height = " + a1.height);
Dimension b1 = a1;
b1.height = 30;
System.out.println("a1.height= " + a1.height + " after change to b1");
}
}
在上面的代码中,我在更改b
的值之前和之后得到a = 10;
的值
基本变量大小写的输出为:
a = 10
a = 10 after change it to b and b is 30
然而,在对象引用变量中,一旦我更改了b1.height = 30;
的值,就会得到一个不同的值
参考变量情况的输出为:
a1.height = 10
a1.height = 30 after change to b1
书中提到,在这两种情况下,复制位模式并放置新副本。如果这是真的,那么为什么我们会有不同的行为呢
# 1 楼答案
只有一个实例
当你说
将
a1
引用的引用地址分配给b1
。因此,当您通过b1
修改height
字段时,您也会修改a1
创建另一个实例
如果希望
b1
成为唯一的引用对象,那么可以使用new
# 2 楼答案
这就是引用和原语之间的根本区别。在这两种情况下,您都会得到实际的值,但只有在对象的情况下,您才有机会影响它的任何其他用途的结果
让我们浏览一下代码
这两项声明如下:
a
的int标识符李>a
的值分配给名为b
的int标识符李>到目前为止,一切顺利。我们不能说
a
被b
引用;我们只接受价值观如果我们宣布:
我们的意思是,取30的值并将其分配给标识符
b
在那一点上,我们不会对
a
做任何事情;它已经包含值10
。这就是为什么a
和b
是不同的现在,当我们到达物体时,表面上的东西并没有真正改变
我们将其翻译为:
Dimension
标识符a1
李>a1
的值分配给Dimension
标识符b1
李>我们仍然在这里分配值,因为Java是pass-by-value。更重要的是,在Java中,对象的值仍然是对该对象的引用
通过上面的例子,
a1
和b1
指向同一个实例现在,当我们说:
我们实际上是在说:
b1
取消引用的字段height
李>我们仍然在这里引用
b1
的值,它与a1
相关。这就是为什么你看到了差异;因为a1
和b1
引用了相同的值(这是相同的引用),所以通过标识符b1
进行的任何更改都会通过a1
反映出来