作者sbrhsieh (偶尔想摆烂一下)
看板java
标题Re: [问题] 请教一个基本的问题
时间Thu Dec 3 23:07:23 2009
※ 引述《legnaleurc (CA)》之铭言:
: : 推 petertc:从这样的结果来看String的行为与primitive type相同 12/02 17:01
: : → petertc:但String不是primitive type吧? 12/02 17:03
: String 的情况不同, 它不是 primitive type
: 但是它是 immutable object
: 也就是说一旦建构完成, 此物件的内容就不能再改变了
: 之後所有的改变都是新增一个复本, 所以不会作用回 function 外
: 其他还有 Integer, Double ... 等
实际上把 adrianshum 提出的例子改成 formal parameter: a 只有单纯的
assignment 操作,还是会有人搞错,因此 adrianshum 的例子重点不在於
Java String (某种程度来说)是 immutable object。
每次出现 call by reference/call by value 的讨论时,总是会出现许许多多
的 Java sample code,甚至 C/C++ 的 sample code,争论了半天认为 Java 是
call by reference 到最後还是不能体会说 Java 只有 call by value 的人为
什麽会如此宣称。
我个人看过不少次这些争论,我觉得似乎有一小块常常都忽略了。
1.
有些人宣称 Java 在传递 non-primitive type value 时,是 pass by
reference,这里的 pass by reference 如果是指 sun 官方说的 pass by
reference,那麽就没有什麽好吵的。官方说的 pass by reference 实际上
是 pass reference value 的意思,不同於 CS 界常见的 pass by reference
定义。
2. pass by ref/value,被 pass 的目标"物件"是什麽?(这里物件泛指有占据
空间的东西)
当例子使用到 assignment 类的 operator 时,此 operator 的目标(lvalue)是
什麽?(这些是跟 programming language 相依的,既然是以 Java 为主题,就
以 Java PL 中这些 operator 的语意来讲)
我个人觉得如果能对第二点多做点切入,用来说明 Java 只有 pass by value
可能会更有说服力(清晰)。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.173.131.1
※ 编辑: sbrhsieh 来自: 218.173.131.1 (12/03 23:09)
1F:推 legnaleurc:well, 我只是想解释为什麽 String 和 Object pass 的 12/03 23:16
2F:→ legnaleurc:结果不同. 之前有看到一个网页总结出二点重点, 不过 12/03 23:18
3F:→ legnaleurc:现在找不到了 orz 12/03 23:20
4F:→ adrianshum:其实没有不同,如果 fooArg = new Foo() 结果也是一样 12/04 01:34