将一个原始变量分配给另一个原始变量与另一个原始变量分配

Dav*_*vid 2 java object-reference primitive-types

我想了解原始和对象引用变量的行为方式有何不同.我使用了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");
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我得到了a = 10;改变值之前和之后的值b.

原始变量大小写的输出是:

a = 10
a = 10 after change it to b and b is 30
Run Code Online (Sandbox Code Playgroud)

但是,在对象引用变量中,一旦我更改了值,我就会获得不同的值 b1.height = 30;

参考变量案例的输出是:

a1.height = 10
a1.height = 30 after change to b1
Run Code Online (Sandbox Code Playgroud)

书中提到,在这两种情况下都会复制位模式并放置新的副本.如果这是真的,那么为什么我们会得到不同的行为呢?

Mak*_*oto 5

这是引用和基元之间的基础差异.在这两种情况下,您都获得了实际,但仅在对象的情况下,您才有可能影响其他任何用法的结果.

让我们来看看代码.

int a = 10;
int b = a;
Run Code Online (Sandbox Code Playgroud)

这两个声明如下:

  • 将值10分配给名为的int标识符a.
  • 将值赋给a名为的int标识符b.

到现在为止还挺好.我们在任何地方都没有说过a引用b; 我们只是在接受价值观.

如果我们宣布:

b = 30;
Run Code Online (Sandbox Code Playgroud)

我们说取值30并将其分配给标识符b.

a那时我们什么都不做; 它已经包含了这个值10.这就是为什么ab不同的原因.

现在,当我们到达目标时,表面上的事情并没有真正发生变化......

Dimension a1 = new Dimension(5, 10);
Dimension b1 = a1;
Run Code Online (Sandbox Code Playgroud)

我们将其翻译为:

  • 将具有(int)参数5和10的新Dimension的实例化值分配给Dimension标识符a1.
  • 将值分配a1Dimension标识符b1.

我们仍然在这里分配,因为Java是按值传递的.这里的踢球者是在Java中,对象的值仍然是对该对象的引用.

通过上面的例子,a1b1指向同一个实例.

现在,当我们陈述:

b1.height = 30;
Run Code Online (Sandbox Code Playgroud)

我们实际上在说:

  • 将值30分配给height通过该值解除引用的字段b1.

我们仍参考的价值b1在这里,这是联系在一起a1.这就是你看到差异的原因; 因为a1并且b1引用相同的值(它是相同的引用),所以通过标识符完成的任何更改b1都会反映出来a1.