Java 将一个基本变量分配给另一个,而将参考变量分配给另一个
我想了解原语和对象引用变量的行为是如何不同的。我使用了Kathy Sierra的OCA/OCP Java SE7中的以下代码作为示例:Java 将一个基本变量分配给另一个,而将参考变量分配给另一个,java,primitive-types,object-reference,Java,Primitive Types,Object Reference,我想了解原语和对象引用变量的行为是如何不同的。我使用了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; Sys
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
的值之前和之后
基本变量大小写的输出为:
a = 10
a = 10 after change it to b and b is 30
a1.height = 10
a1.height = 30 after change to b1
然而,在对象引用变量中,一旦我更改了b1.height=30的值,就会得到一个不同的值代码>
参考变量情况的输出为:
a = 10
a = 10 after change it to b and b is 30
a1.height = 10
a1.height = 30 after change to b1
书中提到,在这两种情况下,复制位模式并放置新副本。如果这是真的,那么为什么我们会有不同的行为?只有一个实例
当你说
Dimension b1= a1; // <-- assigns reference of a1 to b1.
创建另一个实例
如果希望b1
成为唯一的引用对象,则使用new
Dimension b1= new Dimension(a1.width, a1.height); // <-- creates a new Dimension
尺寸b1=新尺寸(a1.宽度,a1.高度);// 这是引用和原语之间的基本区别。在这两种情况下,您都得到了实际值,但只有在对象的情况下,您才有机会影响它的任何其他用途的结果
让我们浏览一下代码
int a = 10;
int b = a;
这两项声明的内容如下:
- 将值10分配给名为
a
的整数标识符
- 将
a
的值分配给名为b
的整数标识符
到目前为止,一切顺利。我们不能说a
被b
引用;我们只接受价值观
如果我们声明:
b = 30;
我们的意思是取30的值并将其分配给标识符b
在这一点上,我们不会对a
做任何事情;它已经包含值10
。这就是为什么a
和b
是不同的
现在,当我们到达物体时,表面上的东西并没有真正改变
Dimension a1 = new Dimension(5, 10);
Dimension b1 = a1;
我们将其翻译为:
- 将带有(int)参数5和10的新维度实例化值分配给
维度标识符a1
- 将
a1
的值分配给维度标识符b1
我们仍然在这里赋值,因为Java是。这里的关键是,在Java中,对象的值仍然是对该对象的引用
通过上面的示例,a1
和b1
指向同一实例
现在,当我们陈述这一点时:
b1.height = 30;
我们实际上是在说:
- 将值30分配给通过值b1取消引用的字段
height
我们仍然在这里引用b1
的值,它与a1
相关。这就是为什么你看到了差异;由于a1
和b1
引用的是相同的值(即相同的引用),因此通过标识符b1
所做的任何更改都会通过a1
反映出来。请阅读此文以澄清您的疑问:@JunedAhsan谢谢,此分发非常有用谢谢您的明确解释。帮助我更好地理解
b1.height=30; // <-- a1.height = 30