在java混乱中向方法传递对象引用

ubby3x7f  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(280)

我不明白为什么在第一个代码(代码1)中,mycounter指向的对象在传递到方法“print”后被更新为值2。但是在第二个代码(代码2)中,str指向的对象仍然是相同的文本“这是一个字符串文本”。我认为str(str是一个对象引用,我认为与mycounter类似)经历了相同的机制,因为它也被传递给一个方法,所以它不应该像mycounter一样被更新吗?
这是代码1:

public class PrimitiveVsReference{

private static class Counter {
    private int count;

    public void advance(int number) {
        count += number;
    }

    public int getCount() {
        return count;
    }
}

public static void main(String args[]) {        
    int i = 30;
    System.out.println("value of i before passing to method : " + i);
    print(30);
    System.out.println("value of i after passing to method : " + i);

    Counter myCounter = new Counter();
    System.out.println("counter before passing to method : " + myCounter.getCount());// this gives 0
    print(myCounter); 
    System.out.println("counter after passing to method : " + myCounter.getCount());// now this gives 2 after passing into the method "print"
}

/*
 * print given reference variable's value
 */
public static void print(Counter ctr) {
    ctr.advance(2);
}

/**
 * print given primitive value
 */
public static void print(int value) {
    value++;
}
}

代码2:

String str = "This is a string literal.";

public static void tryString(String s)
{
    s = "a different string";
}

tryString(str); // isn't this here doing the samething as when myCounter is passed to print in Code 1?
System.out.println("str = " + str); // But this here output the original literal "This is a string literal."

有人能解释一下发生了什么事吗?

oipij1gg

oipij1gg1#

因为字符串是 Immutable (“创建字符串示例后,字符串示例的内容将永远不会更改”),该赋值将创建引用副本现在指向的新字符串对象。原始参考仍然指向“这是一个字符串文字”
你可以试试看 StringBufferStringBuilder 并看到不同的结果。

uidvcgyl

uidvcgyl2#

问题是字符串就像一个基本类型,即使它是类。您可以尝试,但不能从类字符串扩展。
作为一种基本类型,java将其值复制到另一个内存地址,并将这个“新变量”传递给正在调用的方法。然后,当您返回main时,您丢失了该方法的所有更改,因为它位于另一个内存地址中。
对于对象来说是不同的,因为java在调用带有参数的方法时传递对象的内存地址,所以实际上您有权修改实际示例。

相关问题