作者jackyhuang (雪.狼.湖)
看板java
标题Re: [问题] 问一个 记忆体 和 GC 的问题
时间Wed Feb 1 00:12:02 2006
※ 引述《qrtt1 (thinking in java)》之铭言:
: ※ 引述《jackyhuang (雪.狼.湖)》之铭言:
: alias是很重要的一个观念。
: 因为若不了解则在使用物件时可能隐藏了bug
: 详细解说请参考thinking in java,前面介绍reference的章节,
: 与附录介绍clone的章节
你和我对alias的对象指的不一样
我说你写"reference alias"会混淆的原因
是因为会让人以为是"reference's alias"
而书上写的是"alias a reference to an object"
: java中唯一有operator overload的物件只有String
: 唯一合法改变物件内容的方使是呼叫其公用方法(或其他许可的情况)
这不是我举这个例子的原意
: 我将原生变数与物件参考分开讲是基於实际上的结果
: 原生变数的副本并不能互相影响, 是独立的
: 而物件参考的副本, 就是别名。会不会互相影响视其是否为可变动物件而定。
: 若要其互相独立需执行clone方法。
复制的reference value彼此也是互相独立的
只是他们指向同样的一个object instance
所有的东西你在Java当然都讲得通,但是如果把C++的用词混进来(reference, alias...)
我觉得这样的说法只会让人更混乱,reference value亦是被call by value
复制一份过去的行为,有那麽难接受吗? 我不敢说thinking in java写得不清楚
但我认为JLS写得很清楚,它是官方文件权威性不会比作者低
我个人猜thinking in java的作者是从他过去对C/C++的经验,角度去解释java
我认为这已经接近在用词上的争论,所以我也就不再回这篇文章
最後我以前辈TAHO的文章做为结尾,我认为TAHO前辈这篇文章已经足以终结这个讨论串
--
TAHO前辈的文章
发信人:
[email protected] (痴人), 看板: java
标 题: call by XXX 必也正名乎....
发信站: 中山计中美丽之岛 (Tue Oct 30 12:38:01 2001)
转信站:
nhctc_bbs!news.NHCTC!ctu-peer!news.nctu!news.cis.nctu!News.Math.NCTU!ne
Origin: bbs.nsysu.edu.tw
好吧.....
既然要讨论 那就要先来正名一下
首先 得先厘清
何谓 call by value 又何谓 call by reference
当然在这之前 要先定义好 什麽是 value 什麽是 reference
因为最近在翻译 JLS 所以我引用 JLS 里面对这两个词的用法
( 这份文件应该可以代表 sun 的官方看法吧? )
据我的感觉
在 Java 中 有两种 Type
也就是 primitive type 跟 reference type
这两种 Type 限制了 variable 所能握有(hold) 的 value 种类
而所谓的 value 当然就是指 "值",也就是资料的直接内容
(指其位元码,而非其代表的意义)
所谓的 primitive type 我喜欢翻译为基本型别
这种型别的 value 被称之为 primitive value
这种 value 所代表的就是一个数量 一个大小 并不是用来代表其他任何东西的
所谓的 reference type 一般我们翻译成 "参考型别"
这种型别的 value 被称为 reference value
而这个 reference value 并非是实际上应用的东西 不是一个数量
它只是个参考 是一个可以 指向物件 的参考
也就是可以根据 reference value 去找到物件
但是 reference value 并不等於是物件
( 其实 reference value 跟 reference 混用 并不会照成太大的困扰 )
也就是说 value 可分为两种,分别为 primitive value 跟 reference value
而所谓的 variable(常常翻译成变数) 则可以握有(hold) 这两种东西
当 variable hold 的是 primitive value 时
我们称这个 variable 是 primitive type 的变数
反之 当 variable hold 的是 reference value 时
我们称这个 variable 是 reference type 的变数
( 注意,这句话是说 它是个 "参考型别的变数",而非 "它是个参考" )
所以 primitive value,reference value,variable,
primitive type,reference type,object
分别是代表不同的意义 不同的东西 不可混用
所以下面这两个叙述
int i = 1;
String str = "test";
其中 i 跟 str 是 "变数"
"test" 是个字串的生成表示式,会生成 String 物件
1 是个整数的直译字(literal)
int 跟 String 是 type
我们是看不到 value 的,他们是被 hold 在变数中的
另外
i 跟 str 虽然都是变数
但是 JVM 可以知道
i 是 primitive type 的变数, str 是 reference type 的变数
至於要分辨那属於那种 type 的原因
是要知道当我们使用变数 hold 住的 value 时 (当然是一堆位元码)
这些码代表的到底是 primitive value 还是 reference value
比如说如果他的内容是 749452
那这个 749452 代表的是一个数量值,还是记忆体中的一个位置区块
请注意:
严格来说
str 是个 variable 是一个 reference type 的 variable
str 不是一个 参考 而是握有参考值
str 也不是一个 物件 而是握有指向物件的参考值
平常我们在说 "str 物件" 只是为了方便起见 在讨论这些东西时 要说清楚才行
於是
如果所谓的 call by value,是把 value 复制一份给别人
那麽 call by reference 就是把 reference 复制一份给别人
在这种前提下称
"Java 在传递 reference type 引数时 是 call by reference"
是没有问题的
Java 确实是把 variable 所 hold 的 reference value 复制一份
或者可以把 call by reference 改称为 call by reference value 会更清楚
这种情况下甚至可以说
call by reference 是 call by value 的一种
而 "在传递 primitive type 的引数时,是 call by primitive (value)"
call by primitive 也是 call by value 的一种
如果是这样,
那 Java 是 call by reference (value) 也是 call by value
因为 reference value 也是一种 value
这时候去争论 Java 是 call by value 还是 call by reference 有甚麽意义呢?
如果把 variable reference object 混为一谈 value 的意义又没有规范清楚
把人家说的 call by reference 当成 call by object 的意思
然後把别的语言的用法套到 Java 上
那就乱成一团 也难怪会吵翻天了.......
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.121.212.1