将一个原始变量分配给另一个原始变量,而将参考变量分配给另一个

发布于 2021-01-30 17:33:26

我想了解原始和对象引用变量的行为方式不同。我以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

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

关注者
0
被浏览
126
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    这是引用和原始之间的基础区别。在这两种情况下,您都将获得实际 ,但只有在使用对象的情况下,才有机会影响该对象的任何其他用法。

    让我们来看一下代码。

    int a = 10;
    int b = a;
    

    这两个声明表示以下内容:

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

    到目前为止,一切都很好。我们在哪儿都说不出这ab;我们只取价值观。

    如果我们声明:

    b = 30;
    

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

    a那时我们什么也没做。它已经包含值10。这就是为什么ab有所不同。

    现在,当我们到达物体时,表面上的东西并没有真正改变…

    Dimension a1 = new Dimension(5, 10);
    Dimension b1 = a1;
    

    我们将其翻译为:

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

    我们仍然 在这里分配
    ,因为Java是按值传递。这里的缺点是,在Java中,对象的值仍然是对该对象的引用。

    通过上面的示例,a1b1指向 相同的实例

    现在,当我们声明以下内容时:

    b1.height = 30;
    

    我们实际上是在说:

    • 将值30分配给height通过value取消引用的字段b1

    我们仍指的是b1此处与绑定的值a1。这就是为什么您看到差异的原因;因为a1b1引用相同的值(即相同的引用),所以通过标识符完成的任何更改都会通过b1反映出来a1



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看