在方法中修改的对象内容但对象哈希码保持不变

Oh *_*oon 1 java pass-by-reference pass-by-value

在这段代码中,我将一个名称传递给修改String文字name而不是对象本身的方法,当代码退出方法时,对象(由哈希码标识)是相同的,但不是name在方法.

我该怎么解释这个?

public class ObjectContentsPassByReferenceApp {
    private static void modifyObject(Bus bus) {
        bus.setName("SBS Transit");
    }

    public static void main(String args[]) {
        Bus bus;

        bus = new Bus();
        bus.setName("Trans Island Bus");

        System.out.println("Bus initially set to (hashcode): " + bus);
        System.out.println("Bus name: " + bus.getName());

        modifyObject(bus);

        System.out.println("After calling modifyObject (hashcode): " + bus);
        System.out.println("Bus name: " + bus.getName());
    }
}

class Bus {
    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

运行结果:

Bus initially set to (hashcode): sg.java.concepts.passByReference.Bus@8d2ed0
Bus name: Trans Island Bus
After calling modifyObject (hashcode): sg.java.concepts.passByReference.Bus@8d2ed0
Bus name: SBS Transit
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

您没有覆盖hashCode- 因此它将使用实现java.lang.Object,而不会在对象的生命周期中发生变化.你还没有覆盖equals...这意味着a.equals(b)只返回truefor Bus aBus bif a并且b引用完全相同的对象 - 而不是具有相同名称的对象.

请注意,代码中的名称表明Java使用pass by reference.它没有 - 它总是使用pass by value,但这些值总是基元或引用 - 从不是实际的对象.对于简单的赋值等也是如此.

在代码中,你要创建一个单独的 Bus对象.把它想象成一辆真正的公共汽车.它上面有一个名字,上面印有一个序列号(后者是哈希码).当你调用该方法,这是告诉方法如何获取Bus对象-这不是创建一个新的Bus.该方法以新的方式绘制名称,但这对序列号没有任何作用,这与以前一样.

另请注意,这name不是字符串文字 - 它是一个字符串变量.它的初始值来自字符串文字,但稍后更改值对原始字符串对象不起作用.