Java里有没有引用传递

Java里到底有没有引用传递?下面这篇文章给出了解释。顺便翻译了几段话。
[url]http://javadude.com/articles/passbyvalue.htm[/url]
Java里有指针的概念,并且严格按值传递
问题:
[size=medium][i]在Java中对象是通过引用传递的,基本数据类型是通过值传递的。[/i][/size]
这句话并不完全正确。每一个人都会同意基本数据类型是按值传递。那是因为在Java中基本数据类型没有指针或者引用的说法。然而,对象并不是引用传递。正确的说法是对象引用是通过值传递的。
这似乎有些吹毛求疵,但事实远非如此。在意思上是不同的。下面的例子有助于帮助我们区分。

public void foo(Dog d) {
d = new Dog("Fifi"); // creating the "Fifi" dog
}
Dog aDog = new Dog("Max"); // creating the "Max" dog
// at this point, aDog points to the "Max" dog
foo(aDog);
// aDog still points to the "Max" dog

被传递进去的变量(aDog)没有被修改。在调用foo之后,aDog仍然指向the "Max" Dog.很多人像这样去错误的想:
public void foo(Dog d) { 
d.setName("Fifi");
}

有些人想用这段代码来表明在Java中对象确实是通过引用传递的。他们所犯的错误在于
Dog d;

当你那样去定义时,你定义了一个指向Dog对象的指针,而不是对象本身。
[size=x-large]Pointers v.s. References[/size]
造成这样的问题是Sun公司的那帮人制造了一个命名错误。
在编程语言设计中,"pointer"是间接追踪数据片位置的变量。它的值通常为数据片内存的地址。一些编程语言允许操纵内存地址,而另一些则不允许。"reference"是变量的别名。任何对reference variable所做的修改都会直接作用于原始对象。
请看[url]http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.1[/url]里的第二句。
"The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object"
在描述中,他们用的是"pointers"……有意思……
在一开始创造Java语言时,他们是想用"pointer"(你可以在一些地方找到残留痕迹,像NullPointerException)
。Sun公司想把Java作为一种安全的语言,并且Java的一个优势就是它并不允许指针运算,像C++那样。他们很努力试着为这个概念起一个不同的名字,最后定为"references"。这是一个很严重的问题,并且引起了更多的困惑。
[url]http://www.cprogramming.com/tutorial/references.html[/url] 这里对reference做了一个精确的解释。(这是C++的,但它正确的解释了reference variable)
在程序语言设计中,reference这个词最原始来源于你怎样向子程序/函数/过程/方法传递数据。一个引用型参数是被传递变量的别名。
最后,Sun公司犯了一个命名错误,并且后来引起了很多困惑。Java中是有指针的。如果你接受这个说法,这会使Java的行为变得更加容易理解。
[size=x-large]Calling Methods[/size]
像这样调用函数
foo(d);

是将d的值传递给foo,并不传递d所指向的对象。
在Java中的这种写法:
Dog d;

就像是C++的
[/code]
以及使用
[code="java"]d.setName("Fifi");

就像是C++中的
d->setName("Fifi");

总结:在Java中有指针,并且传递进去的是指针的值。在Java没有办法将一个对象本身作为参数传递。你只能传递那个对象的指针。
要牢记,当你这样调用时
foo(d);

你不是在传递一个对象,你正在传递指向这个对象的指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值