发布于2020-11-14 09:11 阅读(1162) 评论(0) 点赞(28) 收藏(3)
我一直认为Java使用传递引用。
但是,我已经看到了几篇博客文章(例如this blog)声称不是(博客文章说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"
。值aDog
内main
未在功能改变foo
与Dog
"Fifi"
作为对象基准由值来传递。如果是通过引用传递的,则aDog.getName()
inmain
将"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");
}
在上面的示例中,Fifi
是调用后的狗的名字,foo(aDog)
因为该对象的名称设置在中foo(...)
。任何操作是foo
执行上d
是这样的,对于所有的实际目的,它们被执行的aDog
,但它是不是可以改变变量的值aDog
本身。
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/498/5e65ee251c32de170f68/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!