日期:2014-05-20  浏览次数:20723 次

Java没有引用传递,仲么办?
初学Java,看到一些代码中,参数传递都是这种形式:public void onDrawFrame(GL10 gl);
这种值传递在C++中应该是很可怕的:
1、因为是类的拷贝,即浪费效率、又浪费空间。
2、像那种全局唯一存在的类,如控制屏幕显示的类,只能传递其本身吧,如果硬要复制出一个对象来,操作还能正确吗?
3、如果参数既是输入、又要输出,这个值参数没办法实现吧。

在C++中应该是这样吧:public void onDrawFrame(const GL10 & gl);
不知道在Java中,这些应该是如何解释和解决的,请指点。

------解决方案--------------------
你这个可以声明static变量啊。
------解决方案--------------------
对c++不是太熟悉,我知道在c语言中参数最好不能是结构体变量,因为值传递复制浪费内存空间,所以参数应该是结构体指针,在java中也类似啊,像你这样public void onDrawFrame(GL10 gl);这里的GL10是引用,就相当于c语言中的指针,它占据不了多少内存,传递参数并不会导致堆空间上的对象产生拷贝,只会产生一份引用的拷贝.
像你说的全局唯一存在的类一般以单例模式存在,拷贝的只是引用,不是对象本身,当然不会影响操作的正确性,因为虚拟机堆空间上此类的对象唯一.
------解决方案--------------------
有 引用传递啊
------解决方案--------------------
你用引用对象操作就是引用传递
------解决方案--------------------
在Java中确实是值传递,但这个值 指的是 对象的引用。就拿你举的例子
public void onDrawFrame(GL10 gl)
中 gl 拿到的是 GL10 的一个实例的引用。 在调用方法时使用的实例是同一个。 拷贝的只是 指向这个实例的引用。
------解决方案--------------------
探讨

额额,我想问前辈们的不是我自己应该如何使用引用。而是看其它的代码,包括OpenGL ES的例程,都是用的这种方法,不免有些担心,想问清楚情况。

按各位前辈的讲法,是不是:public void onDrawFrame(GL10 gl);中gl实质上就是引用的gl的地址(指针)哪?谢谢

------解决方案--------------------
java里
SomeClass variant = new SomeClass();
这里的variant就相当于C/C++的指针变量,即 SomeClass *variant = new SomeClass();
variant的内存保存的是new SomeClass对象的地址
一个变量的值,指的是变量的内存本身保存的信息,所以java里只有值传递,因为引用类型变量的值,就是被引用的对象的地址,所以,作为参数的时候,形参的值和实参的值是一样的,也就是说,形参只是个指针变量,它的内存保存的信息和实参的内存保存信息一样的,都是对象的地址,而不是对象本身,所以不会有所谓的浪费很大的空间,只是4个字节的指针变量的大小而已


------解决方案--------------------
传递的是对象引用的值,不是对象的拷贝。
------解决方案--------------------
public void onDrawFrame(GL10 gl);
这就是红果果的引用。
------解决方案--------------------
引用操作就是值传递,只要你不在引用该对象的方法中新建对象的话,那么操作的就是传入的对象
------解决方案--------------------
只是在传递对象时,会生成该对象的一个引用变量的副本,实际引用的都是同一个对象。就相当于值传递
------解决方案--------------------
java 中只要值传递,当你传递的是基本类型时,在方法呗执行时 在堆栈中又复制了一份.此时参数的作用域只在方法内有效.这时候操作的是复制后的那个值.和传入方法前的参数没有联系.所以在有些地方打印该参数 发现值并没有被改变.这是当传递的是基本类型的情况.
 当传递的是对象时.传递到方法内是对象的引用.是引用复制一份.所以引用还是指向之前的对象.此时在方法内对引用的任何操作都会影响引用实际指向对象的值.这样就相当于值传递.