无法理解具有块范围的 Java 中的按值传递

Not able to understand pass-by-value in Java with block scope

提问人:retro_coder 提问时间:8/6/2022 更新时间:8/6/2022 访问量:50

问:

我正在学习 Java 的基础知识,目前正在了解按值调用的工作原理。我确实知道,当您传入基元时,正在制作值的副本,因此原始值不受影响。当传递对象时,将使用引用变量的副本,从而修改原始对象。如果传递了 String 对象,则不会修改原始值,因为字符串是不可变的:

static void main(String args[]) {
    String name = "Eric";
    changeName(name);
    System.out.println(name); //Eric
}

static void changeName(String nameVal) {
    nameVal = "Gabriel";
}

但是,如果原始 String 对象没有如上所示进行修改,为什么在使用块作用域时它会更改?传递值和块作用域都接受引用变量的值,并尝试更改其内容,但一个不接受,另一个不接受。

static void main(String args[]) {
    String name = "Eric";
    {
        name = "Gabriel"; 
    }
    System.out.println(name); //Gabriel
}

上面两个例子之间的主要区别是什么?

Java 字符串 按值传递

评论

4赞 tkausl 8/6/2022
变量不会传入块作用域。示波器只能访问外部。
2赞 ewramner 8/6/2022
此外,String 的值不会更改。相反,变量名称将更改为指向另一个 String 实例 - 一个包含 Gabriel 的实例。
2赞 azro 8/6/2022
nameVal = "Gabriel"不修改,它会在本地为其分配一个新值。你不修改盒子里的东西,你把 smoething 放在别的地方newVal
2赞 Sweeper 8/6/2022
如果你真的想将方法调用重写到一个块中,我想你可以将其重写为 ,这会产生相同的结果,并且在传递哪些变量方面保持相同的语义。String name = "Eric"; { String nameVal = name; } System.out.println(name);
1赞 Cheng Thao 8/6/2022
从技术上讲,我会说 Java 只支持按值传递。它传递原始变量的值和作为内存地址的引用变量的值。Java 引用变量只是没有 C++ 指针算术的指针。在C++中,我们可以传递int的引用,但在Java中我们不能这样做。在 Java 中,我们只是传递指针,这些指针是内存地址的值。

答: 暂无答案