刚看到一个关于java中只有值传递的帖子,关于“值”的问题,是否是个文字游戏?欢迎讨论

sunyiz 2010-12-30 11:28:15
论题很简单:何为“值”?

我的观点很简单
如果按照java官方现在对“值传递”的解释
那好了,计算机中什么不是“值”呢?
归根到底都是0和1
一切都是“值”

欢迎大家讨论
...全文
167 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZangXT 2010-12-30
  • 打赏
  • 举报
回复
就是C++里的传引用,对CPU而言,也是“值”,关键问题是,函数里对这个“值”的解释是不一样的,可能就是数据本身,可能是个地址,可能是地址的地址,等等。

至于pass by value,pass by reference,是编译中的概念,这里提到的“值”和“引用”是有自己的范畴的。纠结的根源在于,SUN 发明Java的人,把“对象句柄”称为“引用”,这个“引用”不同于编译中“pass by reference” 的"reference",导致一些人的误解,再去误导别人。

绝对的看“一切都是值”,就像“人都是动物”,话对,但意义是什么呢?
weijggmail 2010-12-30
  • 打赏
  • 举报
回复
在java确实都是采用值转递。
当在java中声明一个变量时,它们都会有两个值空间,一个是它的地址值空间,一个是它的具体值空间。
当发生转递时,都是以地址值空间的值来进行转递。

那么,问题来了,当我们进行基础数据类型及类String的转递时,为什么看起来好像是跟C++中的值转递是一样的呢?这是因为,基础数据类型及类String他们的引用的值是不可改变的。
比如:int i = 0; i 的指针地址为x000,具体值为0.有方法
void changI(int i)
{
System.out.println(i);//A
i = 1;//B
}
分析:changI的int i 为i定义一个指针地址,假如为x111,但把i作为参数调用changI(int i)时,changeI中的i同样指向具体值0.当我试图改变i的值时,由于基本数据类型及String类型的数据是常量值(值不可改变),所以JAVA会常量池中新增一个值1.然后changI中的地址指向这个新值。所以基本数据类型及String类型的转递看起来像C++中值转递。至于其他类型的转递就不多说了,跟C++的引用是一个道理的,只是说法不同罢了。只要记住,常量值不可改变,对象值可改变这个原理就容易理解了。


茫茫大海 2010-12-30
  • 打赏
  • 举报
回复
所有的字符都是编码后存放的,也就是都是值啊!
茫茫大海 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sunyiz 的回复:]
但是我的这句话
计算机中只有“值”
不知道你是否能接受
给点意见
[/Quote]
恩,完全赞同啊!本来都是值啊。
keeya0416 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hudie1234567 的回复:]
基本类型就是传递的就是本身的一个副本,是一个具体类型的值。引用类型,传递的是引用,其实个人认为,引用类似于指针,指针就是一个地址,不也是一个值吗?所以说本质上,java中只有值传递!
[/Quote]
我也是这个意思
[Quote=引用 2 楼 sunyiz 的回复:]
恩,这个我赞成

但是我的这句话
计算机中只有“值”
不知道你是否能接受
给点意见
[/Quote]
赞同
sunyiz 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hudie1234567 的回复:]
基本类型就是传递的就是本身的一个副本,是一个具体类型的值。引用类型,传递的是引用,其实个人认为,引用类似于指针,指针就是一个地址,不也是一个值吗?所以说本质上,java中只有值传递!
[/Quote]
恩,这个我赞成

但是我的这句话
计算机中只有“值”
不知道你是否能接受
给点意见
茫茫大海 2010-12-30
  • 打赏
  • 举报
回复
基本类型就是传递的就是本身的一个副本,是一个具体类型的值。引用类型,传递的是引用,其实个人认为,引用类似于指针,指针就是一个地址,不也是一个值吗?所以说本质上,java中只有值传递!
qian119110 2010-12-30
  • 打赏
  • 举报
回复
我认为引用 和值 归结于 值
就相当于人 和动物 归结于 动物


qian119110 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zangxt 的回复:]
就是C++里的传引用,对CPU而言,也是“值”,关键问题是,函数里对这个“值”的解释是不一样的,可能就是数据本身,可能是个地址,可能是地址的地址,等等。

至于pass by value,pass by reference,是编译中的概念,这里提到的“值”和“引用”是有自己的范畴的。纠结的根源在于,SUN 发明Java的人,把“对象句柄”称为“引用”,这个“引用”不同于编译中“pass by ……
[/Quote]

有些事总结的太根本了就没法研究细节了,得出的结论也不一定完整正确了。
就像 “人都是动物”
概念太广了,
如果做医学研究根据“人都是动物” 这个概念,随便找个动物做研究,得出的结果正确?

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧