Java 将一个基本变量分配给另一个,而将参考变量分配给另一个

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

我想了解原语和对象引用变量的行为是如何不同的。我使用了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
的值之前和之后

基本变量大小写的输出为:

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