看板java
标 题Re: Java is "call-by-reference" or "call-by-value".
发信站鸟窝 BBS (Mon Aug 2 13:09:12 2004)
转信站ptt!ctu-reader!ctu-peer!news.nctu!News.Math.NCTU!birdnest
※ 引述《[email protected] (喵喵小雷猫)》之铭言:
: ※ 引述《[email protected] (Null)》之铭言:
: : 各位大大:
: : 如标题所示,没有人可以帮忙举例来说明呢?
: : 或则哪里有正确的文章可以参照呢?
: 众多书藉上没有统一的答案
: 这两个答案都可以, 看你以什麽角度去解释
: 以programming language的角度来说, java可以说是call by reference
: 因为java不具有pointer的位置运算能力
.........................................................
就我看的 programming language 的书,
java 是 call-by-reference,
除了一些非严谨的说法,
无论是 java 正式的 tutorial, 规格书里,
都是讲 java 是 call-by-reference .
http://groups.google.com.tw/groups?hl=zh-TW&lr=&ie=UTF-8
&threadm=48K1We%24AWO%40bbs.ee.ntu.edu.tw&rnum=1&prev=
/groups%3Fq%3Dpass-by-reference%2520eightcloud
%26hl%3Dzh-TW%26lr%3D%26ie%3DUTF-8%26sa%3DN%26tab%3Ddg
寄件者:岚云 (
[email protected])
主旨:java 没有 pass-by-reference 那麽另人难接受吗?
View: Complete Thread (共 7 条留言)
Original Format
网上论坛:tw.bbs.comp.lang.java
日期:2003-09-17 23:58:19 PST
pass-by-xx 是 progamming lanuague 里,
有关参数传递方式的一种分类,
就那分类的定义,
java 没有 pass-by-reference,
而是 pass-by-value,
不管是 java 的技术文件也好,
java 的 tutorial 也好,
(前面都有给过 URL)
都说 java 没有 pass-by-reference,
而是 pass-by-value,
这那麽另人难接受吗?
再从 PL 定义来看 java 的机制,
Programming language 对 pass-by-refernece 的定义.
"
Pass by reference is a second implementation model for inout-mode
parameters. Rather than transmittting data values back and forth,
however, as in pass-by-value-result, the pass-by-reference method
transmits an access path, usually an addesss, to the called subprogram.
This provides the access path to the cell storing the actual parameter.
Thus the called subprogram is allowd to acesss the actual paramter in
the calling program. In effect, the actual parameter is shared with the
called subprogram.
"
java 文件
http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html
4.5.2 Variables of Reference Type
A null reference
A reference to any object (§4.3) whose class (§4.5.6) is assignmen
t compatible (§5.2) with the type of the variable
4.3.1 Objects
An object is a class instance or an array.
The reference values (often just references) are pointers to
these objects, and a special null reference,
which refers to no object.
java reference type 的 variable(变数),
存的是一个 reference value, 指到 object,
也就是 recerence type variable 的 value 是指到一个
object.
改变一个 refernce type 的 variable 的值,
意义是那个 variable 指到不同的 object,
而不是改变 object 里的内容.
当做 methoad call 时,
参数(actual parameter) 是 refernce type 的 variable 时,
(
"the pass-by-reference method
transmits an access path, usually an addesss, to the called subprogram."
)
java 在 method call , 有没有 pass 那个 variable 的 access path,
到被呼叫的 method 里? 没有.
java 是把 variable 的值, 指到 object 的那个 reference value 传到 method 里.
只是 pass-by-value,
让在 method call 里, 那个参数变数的 value 等於 actual parameter 的 value,
也就是让 method call 里的变数所指向的 object,
等於是 actual parameter 上那个变数所指向的 object 是同一个.
是把变数的值传进去, 该二个变数指向同一个物件.
"This provides the access path to the cell storing the actual parameter"
java 在 method 里, 有没有办法去 access 到 actual parameter?
那个 refernce type 的 variable?
不能.
java 只是能 access 到 actual parameter 的值, 所指到的 object,
而不是能 access 到 actual parameter 的那个 variable.
也就在 method call 里, 无法去改变 actual parameter 的值,
也就是, 无法让 actual parameter 的变数, 指到不同的 object.
(
在 c 里, 还有个 & 的 operator, 可以取到一个 variable 的 "access path",
所以利用 &, 可以把一个 varialbe的 access path 取出来,
成为模拟 pass-by-reference, 有人称之为 explicit pass-by-reference.
但是, 那个还是不叫 pass-by-refernce, 因为
actual parameter 是 &variable, 不是 variable.
pass 的 是一个 variable 的 unary operator 运算结果的一个 value.
更不用说, 在 java 根本没有任何方式可取到一个 variable 的 "access path".
)
--
※ Origin: 鸟窝 (BirdNest.twbbs.org) ◆ From: 61-62-68-135-adsl-tpe.STATIC.so-net.net.tw