锁定老帖子 主题:一个绝对害了不少人的Java技术问题!
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-04-07
曹晓钢 写道 说到受害者的问题....我觉得受害者应该只会是以前的C使用者.甚至于C++使用者都不会有问题.因为STL里面已经出现了类似java引用的概念,Vector之类都是采用引用的方式的.
stl的模板参数不能为reference. |
|
返回顶楼 | |
发表时间:2004-04-07
曹队长,还有个问题,jvm内存模型是不是考虑过优化?
既是在循环之类的疯狂操作中把变量放入cpu寄存器 那样的话,同步操作就要麻烦了,有必要使用 volatile关键字从主寸读取变量吗? |
|
返回顶楼 | |
发表时间:2004-04-07
同志啊,java程序跑在虚拟机里面,哪儿来的cpu寄存器?
|
|
返回顶楼 | |
发表时间:2004-04-07
o'reilly java线程第2版
p328 在vm1.2以及之前各个vm版本中,java内存模型总是从主寸中读取变量,从而使得对这一点讨论没有多大意义,但是随着jvm越来越成熟,java会引入新的内存模型.... java内存模型比较复杂,线程可以在本地内存(比如机器积存器)中保存变量,这样,如果一个线程改变变量值,那么另外的现成可能看不到值的变化... ----------------------------- 我看了这里也是奇怪,也许sun还没引入吧 这本书的作者都是sun公司人,负责开发jdk原型 |
|
返回顶楼 | |
发表时间:2004-04-07
Trustno1 写道 曹晓钢 写道 说到受害者的问题....我觉得受害者应该只会是以前的C使用者.甚至于C++使用者都不会有问题.因为STL里面已经出现了类似java引用的概念,Vector之类都是采用引用的方式的.
stl的模板参数不能为reference. 嘿嘿,关于C++的问题,我怕说错了,就找了个高手来问了一下: 引用 Zhao Zhenping(一波三折) says:
Java引用? Zhao Zhenping(一波三折) says: C++中早就有引用呀 Xiaogang (时间要用在刀刃上) says: reference Zhao Zhenping(一波三折) says: 模版的参数可以有引用 Xiaogang (时间要用在刀刃上) says: 我就是说,用STL的时候,可以抛弃指针,完全采用类似java的引用的方式 Zhao Zhenping(一波三折) says: 不过不能完全抛弃,里面还是有一些地方需要用指针的语法的。 Xiaogang (时间要用在刀刃上) says: 好 Xiaogang (时间要用在刀刃上) says: 你说的这个引用,是什么样的引用?java里面我说的引用,是指指向堆地址的一个引用 Zhao Zhenping(一波三折) says: 就是C++的引用啊,堆地址,普通数据段都可以引用啊,就是C++中部分代替指针的东西。 Xiaogang (时间要用在刀刃上) says: ok. |
|
返回顶楼 | |
发表时间:2004-04-07
电视机和遥控器可以很形象的描叙和解释这个问题。
可以把遥控器看作是电视机的一个引用拷贝,只要电视机存在,也就是用遥控器对准一台电视机,按遥控器上面的各种按扭(function)可以对电视机产生各种影响,但是你换一个遥控器对电视机来说是不会产生影响的,电视机并不会因为遥控器换了而变成别的电视机。同时遥控器也可以不对准原来的电视机,转去对准别的电视机,这对原来的电视机也是不会产生影响的。一台电视机可以有多个遥控器,并且只要某个遥控器对准了这台电视机,这个遥控器就可以通过它上面的按扭改变电视机的状态。 |
|
返回顶楼 | |
发表时间:2004-04-07
曹兄,不是C的引用误导了我。而是大多数Java的书籍中是明确的说明Java中对象是传递引用的,没有哪本书是像你挖出一大堆虚拟机的调用堆栈去解释的。我倒想问问你了,呵呵,C++的传递引用是什么概念?
正是因为这种概念上的误解,让许多人都理解错了。 我可以告诉你,学Java的,在三年以下的,我估计有90%以上的人都会理解错,也许很多人不承认,但事实真是如此。当然,我们不能因为就这样一个小问题就说大家水平不行什么的,再厉害的高手都有不清楚的地方的。 曹兄,你说呢? |
|
返回顶楼 | |
发表时间:2004-04-07
曹晓钢 写道 Trustno1 写道 曹晓钢 写道 说到受害者的问题....我觉得受害者应该只会是以前的C使用者.甚至于C++使用者都不会有问题.因为STL里面已经出现了类似java引用的概念,Vector之类都是采用引用的方式的.
stl的模板参数不能为reference. 嘿嘿,关于C++的问题,我怕说错了,就找了个高手来问了一下: 引用 Zhao Zhenping(一波三折) says:
Java引用? Zhao Zhenping(一波三折) says: C++中早就有引用呀 Xiaogang (时间要用在刀刃上) says: reference Zhao Zhenping(一波三折) says: 模版的参数可以有引用 Xiaogang (时间要用在刀刃上) says: 我就是说,用STL的时候,可以抛弃指针,完全采用类似java的引用的方式 Zhao Zhenping(一波三折) says: 过 能完全抛弃,里面还是有一些地方需要用指针的语法的。 Xiaogang (时间要用在刀刃上) says: 好 Xiaogang (时间要用在刀刃上) says: 你说的这个引用,是什么样的引用?java里面我说的引用,是指指向堆地址的一个引用 Zhao Zhenping(一波三折) says: 就是C++的引用啊,堆地址,普通数据段都可以引用啊,就是C++中部分代替指针的东西。 Xiaogang (时间要用在刀刃上) says: ok. 你去试试看vector<int &> a肯定报错。要么是vector<int *>要么是vector<int> c++的reference是一个非常奇怪的概念,既不是pointer也不是java的reference. 比较一下C++的引用,以及java的引用。 C++引用很弱。不能rebind,没有null value,在类型系统中地位也奇怪。对C++引用和指针的比较很多,其实引用一次性bind到一个运行时决定的lvalue,和指针相比更接近普通的值对象。既然引入引用是为了运算符重载,这一点也比较自然,运算符就是对lvalue/rvalue操作的么。 java引用更像指针,区别是没有类型,所以不会有“引用的引用”。另外就是C指针同时还是数组的ramdom iterator。 因此总结一下C++的引用与Java的区别是 1.c++中有左值和右值得概念。c++的引用只能是左值。而java不存在左值和右值得概念,所以java reference可以理解为左右值。 2.因此c++的reference不能做到rebind.例如 T t1,t2; T & t=t1;//引用付值 t=t2;//对象之间的copy 3.c++的reference没有null value。 T &//错误 T &t=NULL;//错误 4.所以Java的refernce其实更像pointer而不是c++的reference |
|
返回顶楼 | |
发表时间:2004-04-07
凤舞凰扬 写道 曹兄,不是C的引用误导了我。而是大多数Java的书籍中是明确的说明Java中对象是传递引用的,没有哪本书是像你挖出一大堆虚拟机的调用堆栈去解释的。我倒想问问你了,呵呵,C++的传递引用是什么概念?
正是因为这种概念上的误解,让许多人都理解错了。 我可以告诉你,学Java的,在三年以下的,我估计有90%以上的人都会理解错,也许很多人不承认,但事实真是如此。当然,我们不能因为就这样一个小问题就说大家水平不行什么的,再厉害的高手都有不清楚的地方的。 曹兄,你说呢? hoho,C++的问题我早就声明了我是低手,以前用C++工作的时候一上来就是用STL的,基本上就没有用过指针. STL和java里面的概念\用法都很相似. 大多数Java的书籍中是明确的说明Java中对象是传递引用的,他们并没有说错,因为java中传值和传引用是一个意思.我上文已经有说明.引用就是通过值传过去了. t.setName(),是指对t指向的对象执行setName(). t只不过是引用. C里面的类似代码,如果是传引用的话,实际传递的是"指针的指针",指针被内层函数改变了,就会影响外层的变量. |
|
返回顶楼 | |
发表时间:2004-04-07
指针在我看来是c最不成功的设计,很难理解为什么要用这个蹩脚的东西。实际上对于数据的传递如果用汇编级的分析就更容易明白。
在x86下,传值(真正的简单类型数据)现代编译器都是利用寄存器,这点在jvm中是无法实现的,没有办法只有一个鸟相当IP的寄存器。我不是玩这个把戏很久了,以后也不想玩这个寄存器。于是就只好用堆栈。 而传递对象,在x86下有两种情况。一种是把对象当作一组数据用堆栈来传递,这个时候你可能会pop,也可能利用BP。但是堆栈总是一个暂时的存储场所。 有的时候你会对象在数据区划分了一块地方,你传递的是它的地址。同时如果你使用堆栈而应用BP,你一样会传递它的地址或者偏移量。 这些清晰的概念在c下被搞的乌七八糟,鬼晓得是如何作的。 |
|
返回顶楼 | |