论坛首页 Java企业应用论坛

一个绝对害了不少人的Java技术问题!

浏览 92914 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-04-07  
曹晓钢 写道
说到受害者的问题....我觉得受害者应该只会是以前的C使用者.甚至于C++使用者都不会有问题.因为STL里面已经出现了类似java引用的概念,Vector之类都是采用引用的方式的.

stl的模板参数不能为reference.
0 请登录后投票
   发表时间:2004-04-07  
曹队长,还有个问题,jvm内存模型是不是考虑过优化?
既是在循环之类的疯狂操作中把变量放入cpu寄存器
那样的话,同步操作就要麻烦了,有必要使用
volatile关键字从主寸读取变量吗?
0 请登录后投票
   发表时间:2004-04-07  
同志啊,java程序跑在虚拟机里面,哪儿来的cpu寄存器?
0 请登录后投票
   发表时间:2004-04-07  
o'reilly java线程第2版
p328
在vm1.2以及之前各个vm版本中,java内存模型总是从主寸中读取变量,从而使得对这一点讨论没有多大意义,但是随着jvm越来越成熟,java会引入新的内存模型....

java内存模型比较复杂,线程可以在本地内存(比如机器积存器)中保存变量,这样,如果一个线程改变变量值,那么另外的现成可能看不到值的变化...

-----------------------------
我看了这里也是奇怪,也许sun还没引入吧

这本书的作者都是sun公司人,负责开发jdk原型
0 请登录后投票
   发表时间: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.
0 请登录后投票
   发表时间:2004-04-07  
电视机和遥控器可以很形象的描叙和解释这个问题。
可以把遥控器看作是电视机的一个引用拷贝,只要电视机存在,也就是用遥控器对准一台电视机,按遥控器上面的各种按扭(function)可以对电视机产生各种影响,但是你换一个遥控器对电视机来说是不会产生影响的,电视机并不会因为遥控器换了而变成别的电视机。同时遥控器也可以不对准原来的电视机,转去对准别的电视机,这对原来的电视机也是不会产生影响的。一台电视机可以有多个遥控器,并且只要某个遥控器对准了这台电视机,这个遥控器就可以通过它上面的按扭改变电视机的状态。
0 请登录后投票
   发表时间:2004-04-07  
曹兄,不是C的引用误导了我。而是大多数Java的书籍中是明确的说明Java中对象是传递引用的,没有哪本书是像你挖出一大堆虚拟机的调用堆栈去解释的。我倒想问问你了,呵呵,C++的传递引用是什么概念?
   正是因为这种概念上的误解,让许多人都理解错了。
   我可以告诉你,学Java的,在三年以下的,我估计有90%以上的人都会理解错,也许很多人不承认,但事实真是如此。当然,我们不能因为就这样一个小问题就说大家水平不行什么的,再厉害的高手都有不清楚的地方的。
   曹兄,你说呢?
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2004-04-07  
凤舞凰扬 写道
曹兄,不是C的引用误导了我。而是大多数Java的书籍中是明确的说明Java中对象是传递引用的,没有哪本书是像你挖出一大堆虚拟机的调用堆栈去解释的。我倒想问问你了,呵呵,C++的传递引用是什么概念?
   正是因为这种概念上的误解,让许多人都理解错了。
   我可以告诉你,学Java的,在三年以下的,我估计有90%以上的人都会理解错,也许很多人不承认,但事实真是如此。当然,我们不能因为就这样一个小问题就说大家水平不行什么的,再厉害的高手都有不清楚的地方的。
   曹兄,你说呢?


hoho,C++的问题我早就声明了我是低手,以前用C++工作的时候一上来就是用STL的,基本上就没有用过指针.

STL和java里面的概念\用法都很相似.

大多数Java的书籍中是明确的说明Java中对象是传递引用的,他们并没有说错,因为java中传值和传引用是一个意思.我上文已经有说明.引用就是通过值传过去了.

t.setName(),是指对t指向的对象执行setName(). t只不过是引用.

C里面的类似代码,如果是传引用的话,实际传递的是"指针的指针",指针被内层函数改变了,就会影响外层的变量.
0 请登录后投票
   发表时间:2004-04-07  
指针在我看来是c最不成功的设计,很难理解为什么要用这个蹩脚的东西。实际上对于数据的传递如果用汇编级的分析就更容易明白。
在x86下,传值(真正的简单类型数据)现代编译器都是利用寄存器,这点在jvm中是无法实现的,没有办法只有一个鸟相当IP的寄存器。我不是玩这个把戏很久了,以后也不想玩这个寄存器。于是就只好用堆栈。
而传递对象,在x86下有两种情况。一种是把对象当作一组数据用堆栈来传递,这个时候你可能会pop,也可能利用BP。但是堆栈总是一个暂时的存储场所。
有的时候你会对象在数据区划分了一块地方,你传递的是它的地址。同时如果你使用堆栈而应用BP,你一样会传递它的地址或者偏移量。
这些清晰的概念在c下被搞的乌七八糟,鬼晓得是如何作的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics