Java 是"逐次引用"还是"逐值传递"? | Java Debug 笔记

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

提问:Java 是"逐次引用"还是"逐值传递"?

我一直以为Java使用逐一引用。

然而,我见过一些博客文章(例如,这个博客),声称它不是(博客文章说,Java使用逐值传递)。

我想我不理解他们做出的区别。

解释是什么?

高分回答:

爪哇总是逐值的。 不幸的是,我们根本不处理一个对象,而是杂耍对象处理称为参考(这当然是通过价值)。所选择的术语和语义很容易混淆许多初学者。

它是这样的:

public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    // we pass the object to foo
    foo(aDog);
    // aDog variable is still pointing to the "Max" dog when foo(...) returns
    aDog.getName().equals("Max"); // true
    aDog.getName().equals("Fifi"); // false
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // change d inside of foo() to point to a new Dog instance "Fifi"
    d = new Dog("Fifi");
    d.getName().equals("Fifi"); // true
}
复制代码

在上面的例子仍然会返回。内部值在函数中不会更改,因为对象参考是按值传递的。如果它通过参考,那么在呼叫后返回。aDog.getName()"Max"aDogmainfooDog"Fifi"aDog.getName()main"Fifi"foo

同样:

public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    foo(aDog);
    // when foo(...) returns, the name of the dog has been changed to "Fifi"
    aDog.getName().equals("Fifi"); // true
    // but it is still the same dog:
    aDog == oldDog; // true
}
复制代码

public static void foo(Dog d) { d.getName().equals("Max"); // true // this changes the name of d to be "Fifi" d.setName("Fifi"); } 在上面的例子中,是狗的名字后调用,因为对象的名称被设置在里面。执行的任何操作都是为了所有实际目的执行,但无法更改变量本身的价值。Fififoo(aDog)foo(...)foodaDogaDog

文章翻译自 *.com/questions/4…

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞???? 求关注❤️ 求分享???? 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️

上一篇:剑指 Offer 57 - II. 和为s的连续正数序列 + 双指针 + 数论


下一篇:s-100系列电子海图与s57电子海图的区别,电子海图开发一百篇第五十一篇