当前位置: 首页 > 知识库问答 >
问题:

Java对象分配行为不一致?

薛烈
2023-03-14

根据这个答案,https://stackoverflow.com/a/12020435/562222,将一个对象分配给另一个对象只是复制引用,但让我们看看以下代码段:

public class TestJava {

    public static void main(String[] args) throws IOException {

        {
            Integer x;
            Integer y = 223432;
            x = y;
            x += 23;
            System.out.println(x);
            System.out.println(y);
        }
        {
            Integer[] x;
            Integer[] y = {1,2, 3, 4, 5};
            x = y;
            x[0] += 10;
            printArray(x);
            printArray(y);
        }
    }

    public static <T> void printArray(T[] inputArray) {
        for(T element : inputArray) {
            System.out.printf("%s ", element);
        }
        System.out.println();
    }

}

运行它可以提供:

223455
223432
11 2 3 4 5 
11 2 3 4 5 

共有3个答案

谈禄
2023-03-14

当您执行此操作时,您实际上创建了另一个对象,并且在这个新对象上创建了x点。因此,x和y是两个不同的对象。

秦承安
2023-03-14

整数是不可变的,因此创建后不能修改其状态。当你这样做的时候:

Integer x;
Integer y = 223432;
x = y;
x += 23;

x=23正在为x变量分配一个新的Integer值。

另一方面,数组是可变的,因此当您更改数组的状态(例如更改数组中的一个元素)时,另一个也会受到影响。

井宪
2023-03-14

行为是一致的。这一行:

x += 23;

实际上将一个不同的整数对象分配给x;它不会修改该语句之前由x表示的值(实际上,该语句与对象y相同)。在幕后,编译器正在解装箱x,然后装箱添加23的结果,就像代码是写的一样:

x = Integer.valueOf(x.intValue() + 23);

如果您检查编译时生成的字节码(编译后运行javap-c TestJava),您可以准确地看到这一点。

第二部分是这样的:

x[0] += 10;

还将新对象指定给x[0]。但是由于xy引用相同的数组,这也将y[0]更改为新对象。

 类似资料:
  • 问题内容: 我是Java的新手,因此我对对象分配有一些疑问。例如, 假设变量的测试类中定义的,我说得对假设T1和T2点到修改同一个对象会影响和?其实我测试了一下,似乎我是对的。但是,当我尝试相同的操作时,修改仅发生在不影响另一侧的一侧。这是什么原因呢? 编辑:我尝试使用String的情况。 我通过测试String的大小写来意识到我的错误,因为它是不可变的。我认为修改字符串的情况实际上是将对“ 1”

  • 这是一个子类 这是另一个子类 我最终想要的是这样的: 这不仅表示:不能分配最后一个字段dog.animalnumber,而且我认为它也行不通。有什么建议吗? 提前感谢!

  • 问题内容: 在课堂上,我有: 除了可以从参数中提供的对象创建bar的副本之外,还可以在构造函数中包含指向bar的指针,以便更改原始bar会更改此对象中的字段吗? 另一种放置方式: 可以进行设置,以便打印y打印9而不是7? 问题答案: 您的最后一个示例以这种方式工作,因为 int 是基元,它是按值复制的。在第一个示例中,“ this.bar ”将保存对 bar 的引用(某种指针)的副本。因此,如果您

  • 问题内容: 我试图通过在会话中设置项目列表来将它们发送到JSP。我在这里使用Spring控制器。 会话对象包含所有三个项目。 问题: 预期: 会话对象应包含3个项目。 实际: 会话中只有2个项目可用,因为删除了第三个项目更新了会话对象。但是我从未将更新的l对象添加到会话中。为什么Java在返回页面之前重新分配会话对象?因此,我是否需要将l复制到另一个列表并使用它? 问题答案: 您必须首先了解Jav

  • 注意: Adobe Muse 不再添加新增功能,并将于 2020 年 3 月 26 日停止支持。有关详细信息和帮助,请参阅 Adobe Muse 服务结束页面。 Adobe Muse CC 2015.1 中的增强功能 / 2016 年 2 月 通过在网页中为不同对象应用状态过渡,可以使您的设计更加有趣、更具吸引力。在每个对象中,您还可以为每种状态过渡设置延迟、持续时间和定时选项。 在状态过渡中,支

  • 假设我有一个变量,我想设置一些默认值。 这两种选择的好处/缺点是什么? 使用对象传播 或者用Object.assign 这就是让我好奇的promise。