有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

    不,不应该

    Java总是按值传递,但该值本身就是一个引用。所以,如果你调用一个方法来改变那个特定对象的数据,它会反映到从那个特定对象检索数据的所有方法中

    解决这个问题的一个可能办法是使immutable types。有些类已经实现了这一点,例如,java.time包中的所有类都是不可变的。这些类的所有“setter”都返回实例的新副本,并设置了指定的值。例如^{}


    下面是传递值和传递引用之间差异的一个小示例

    看看这个代码

    void main() {
        Dog myLittleDog = new Dog("Brutus");
        change(myLittleDog);
        System.out.println(myLittleDog.getName());
    }
    
    void change(Dog aDog) {
        aDog = new Dog("Jack");
    }
    

    这里发生了什么?我们将名为“布鲁特斯”的狗传递给change方法。在这种方法中,我们用一只名叫“杰克”的新狗来代替布鲁特斯。如果我们打印myLittleDog的名字,他的名字是什么?会是“杰克”吗
    答案是否定的。对狗的引用的值被复制,并在change方法中以aDog的名称提供。myLittleDogaDog都是指记忆中的同一个实际的狗对象。但是现在change方法用new对象重新分配aDog。此时,变量myLittleDogaDog都指向不同的对象。一旦change方法退出,变量aDog就不可访问,并且Jack被垃圾收集myLittleDog仍然被称为“布鲁特斯”

    相反,如果Java是通过引用传递的,情况就不是这样了。那么aDog的重新分配也意味着myLittleDog的重新分配

    另见:What's the difference between passing by reference vs. passing by value?

    但是为什么我的selectedService仍然在变异呢

    虽然引用的值在传递给方法时会被复制,但这不意味着对象不能更改(也就是说,不能被修改)。假设我给你一份我的房子钥匙。你去我家把沙发搬到厨房去。如果我进了我的房子,我会看到沙发被挪动了。参考值会被复制,但每个访问参考对象(房屋)的人都会看到对其的修改

  2. # 2 楼答案

    selectedService这里有一个引用变量,它指向您分配给它的任何对象。当将dataResponse.getServices().get(position)赋值给selectedService时,看起来好像是在给它赋值,然而,实际上赋值的是对原始对象的引用

    https://www.geeksforgeeks.org/clone-method-in-java-2/所述

    Unlike C++, in Java, if we use assignment operator then it will create a copy of reference variable and not the object

    创建对象副本的步骤

    使用clone()方法创建对象的副本,如中所示

    selectedService = (SelectedServiceClass) dataResponse.getServices().get(position).clone();