将一个原始变量分配给另一个原始变量,而将参考变量分配给另一个
我想了解原始和对象引用变量的行为方式不同。我以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");
}
}
在上面的代码中,我获得了a = 10;
更改之前和之后的值b
。
基本变量case的输出为:
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
书中提到在两种情况下都复制位模式并放置新副本。如果这是真的,那为什么我们会得到不同的行为呢?
-
这是引用和原始之间的基础区别。在这两种情况下,您都将获得实际 值 ,但只有在使用对象的情况下,才有机会影响该对象的任何其他用法。
让我们来看一下代码。
int a = 10; int b = a;
这两个声明表示以下内容:
- 将值10分配给名为的int标识符
a
。 - 将的值分配
a
给名为的int标识符b
。
到目前为止,一切都很好。我们在哪儿都说不出这
a
点b
;我们只取价值观。如果我们声明:
b = 30;
我们是说 取值30并将其分配给标识符
b
。a
那时我们什么也没做。它已经包含值10
。这就是为什么a
和b
有所不同。现在,当我们到达物体时,表面上的东西并没有真正改变…
Dimension a1 = new Dimension(5, 10); Dimension b1 = a1;
我们将其翻译为:
- 将具有(int)参数5和10的新Dimension的实例化值分配给
Dimension
identifiera1
。 - 将的值分配
a1
给Dimension
标识符b1
。
我们仍然 在这里分配 值
,因为Java是按值传递。这里的缺点是,在Java中,对象的值仍然是对该对象的引用。通过上面的示例,
a1
并b1
指向 相同的实例 。现在,当我们声明以下内容时:
b1.height = 30;
我们实际上是在说:
- 将值30分配给
height
通过value取消引用的字段b1
。
我们仍指的是
b1
此处与绑定的值a1
。这就是为什么您看到差异的原因;因为a1
和b1
引用相同的值(即相同的引用),所以通过标识符完成的任何更改都会通过b1
反映出来a1
。 - 将值10分配给名为的int标识符
-
在Python中将一个变量的值分配给另一个变量时会发生什么?
2021-01-29 关注 0 浏览86 1答案
-
GSON +休眠:导致“一个实体副本已分配给另一个实体”的相同对象
2021-02-01 关注 0 浏览125 1答案
-
Javascript“变量”:如何基于另一个变量分配变量?
2021-02-02 关注 0 浏览89 1答案
-
可以将结构指针方法中的指针重新分配给另一个实例吗?
2021-02-01 关注 0 浏览117 1答案
-
如果在另一个df中的日期范围之间,python将值分配给pandas df
2021-01-29 关注 0 浏览89 1答案
-
将数组分配给新变量,更改原始变量将更改新变量
2021-01-30 关注 0 浏览114 1答案
-
为什么分配给一个空列表而不分配给一个空元组是有效的?
2021-01-29 关注 0 浏览73 1答案
-
如果两个变量指向同一个对象,为什么不重新分配一个变量会影响另一个变量?
2021-01-29 关注 0 浏览133 1答案
-
当说明一个结构体变量时系统分配给它的内存是()。
2020-12-25 关注 0 浏览51 1答案
-
将一个类变量传递给另一个类
2021-01-29 关注 0 浏览100 1答案