2 u010775468 u010775468 于 2016.05.04 21:45 提问

java中的操作句柄的问题

在学习java的过程中,遇到这样一个问题:值传递和引用传递
我知道在所谓的值传递,仅仅是复制,然后传递,这样修改的值不会影响原值(基本数据类型都是值传递)
而引用传递是传的事地址,这样修改的话,原值也会被修改(类似于函数的参数如果是一个对象的话)
以上是我的理解,不对之处,请各位指正和补充(新人初学,谢谢)
但是还有这样一个问题:
A a = B.方法
这条语句和A a = new A();创建对象有点像,之前问过一次,但是不是很理解,所以再次问下,还望各位能解释一下,第一条语句,我理解的是这个a是一个B.方法返回值的一=引用,所以当我想要操作B,返回值时,只要操作a就可以了,但是我理解的是这个是不是可以理解为引用传递,所以当修改a的时候,B.方法的返回值也就会被改变,不知道这样对不对,新人对于这些值传递。引用传递一直搞不懂,不知道怎么区分,以及都有什么用,求各位能够解答解答。谢谢大家了

3个回答

caozhy
caozhy   Ds   Rxr 2016.05.04 23:18
已采纳
 首先,java只支持函数的值传递,不支持什么引用传递。换一句话说,修改形参,永远不会作用到实际参数上。
区别在于,这个“值”是什么,对于class类型,这个值是引用,对于值类型,这个值就是值。
比如
A a = new A();
A b = a; //此时b和a指向同一个对象。
b.x = 1; //因为a和b指向同一个对象,所以修改b.x其实就是修改的a.x
b = new A(); //此时 b 指向另一个对象,那么a呢?a还是指向原来的对象。
b.x = 2;//此时因为b和a指向不同的对象,所以不会修改a。
对于函数
void foo(A a)
{
a = new A();
}
调用
A a = null;
foo(a);
这么写,永远不可能改变调用者a的引用,a还是指向null。
我说了,Java不支持引用传递,为了模仿这个语法,必须再包装一层。
class B
{
A a;
}
void foo(B b)
{
b.a = new A();
}
调用
B b = new B();
b.a = null;
foo(b); //此时,b.a指向一个对象,不再是null,但是作为包装的b,则还是按值传递。


u010775468
u010775468 哦哦,万分感谢,差不多懂了,感觉我的好多问题都有您的回答啊,真是谢谢了!
大约 2 年之前 回复
caozhy
caozhy 回复键盘手C: 是的。还有什么不清楚的么?
大约 2 年之前 回复
u010775468
u010775468 哦哦,引用就是相当于是一个地址,指向这个对象的地址吗?
大约 2 年之前 回复
caozhy
caozhy 回复键盘手C: 两者是一样的,拷贝的是引用,而不是对象。
大约 2 年之前 回复
u010775468
u010775468 谢谢您写的这么详尽,但是最后一点我还是不懂,对于值得传递而言,只要对于同一个空间进行操作,那么另一个指向这个空间的对象值也会随着改变,但是对于函数而言,值得传递就是相当于copy一份?,那么是不是可以理解为A a这个参数只是一个复制过来的,所以操作是不会改变原值的,但是为什么第二个例子只是包装了下反而就可以了呢,实在不好意思,有点困惑,麻烦您能解释下吗
大约 2 年之前 回复
havedream_one
havedream_one   2016.05.05 11:05

当修改a的时候,B.方法的返回值也就会被改变,
假设B里新创建了一个对象,那么a指向了这个对象,而你再次进入B之后,B中就不能再操作这个对象了,此时只有a可以更改这个对象

danielinbiti
danielinbiti   Ds   Rxr 2016.05.04 21:58
 java如果从定义来说都是值传递,没有引用传递,这和C,C++等不一样。
 例如你上面A a=B.方法
 如果你再上面调用B方法后,在调用a=C.方法,则只是改变了a这个变量对象的地址值,原来的对象是不会改变的。

 一般误认为有引用传递,是因为觉得比如
 class A{
   public int k = 0;
 }
 比如 
 A a=B.方法
 A a1 = a;
 操作a.k = 5;这么一步改变类内部的属性,a1引用的对象a1.k也跟着改变。误以为是引用传递,但实际这是因为指向的是同一个对象而已。
u010775468
u010775468 哦哦,那简单点说的话,这个A.a就是相当于定义一个A类的对象a?就算不用new关键字,还有如果返回值仅仅是普通类型的话,是不是是不会修改原值的,还有是不是只要是涉及到对象的问题,参数传递,还有对于另一个对象的引用,传的值都是原值,不知道这样理解对不对,麻烦您了,如果您还知道什么时候涉及到传递原值的话,还望您能补充补充,谢谢
大约 2 年之前 回复
danielinbiti
danielinbiti 回复键盘手C: 如果返回值是对象,改变对象内的属性,那可以通过操作a,改变a内部的属性的方式改变原有对象的属性值
大约 2 年之前 回复
danielinbiti
danielinbiti 回复键盘手C: 看你怎么定义了,如果是对象,那就是对象,如果定义成int那就是一个基本类型变量,像我上面举的例子就是类对象。
大约 2 年之前 回复
u010775468
u010775468 谢谢, 那么就像您举得例子,这个A a = B .方法应该怎么理解呢,您之前说是地址,那么如果我要对这个B,方法的返回值进行操作的话,是不是可以用a调用(顺便问下这个a是什么?是对象?还是仅仅是一个变量?)
大约 2 年之前 回复
danielinbiti
danielinbiti 回复键盘手C: 传递对象,操作对象内属性,是会传递前对象的原值的。如果不是修改对象的属性,只是对对象变量重新定义或者赋值,则原对象不会改变。 int等基本类型只是入栈,可以认为是copy一份,于原值不是一份
大约 2 年之前 回复
u010775468
u010775468 首先谢谢您的热心回答,那么在一个方法中,如果这个时候函数的参数的传递是对象的话,是不是在这个方法中如果对这个对象中得值进行了修改,是不是原来的值就会改变?还有函数的参数的传递如果是int等基本类型的话,是不是都是copy一份,原值不改变的?
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
得到Java程序的WIN32窗口句柄(转)
我们知道C++的每个窗体都对应着一个句柄HWND,通过这个句柄我们可以对这个窗口以及它的资源进行各种操作,比如让它前端显示等。那么操作系统给Java编写的窗体(Frame或者JFrame的对象或者子类对象)有没有分配这个唯一的HWND呢?如果存在的话我们怎么来在Java程序中得到它并利用它来操作这个窗口呢?         用spy++查看一下,Frame或者JFrame的对象或者子类对象确实都
java中对象句柄
Java 句柄学习
Java(七) 句柄
在学习什么是句柄之前我们先学习虚拟机的对对象的访问方式 一、句柄访问方式: 使用句柄访问对象,会在堆中开辟一块内存作为句柄池,句柄中储存了对象实例数据(属性值结构体)的内存地址,访问类型数据的内存地址(类信息,方法类型信息), 对象实例数据一般也在heap中开辟,类型数据一般储存在方法区中。使用句柄访问的好处是句柄中储存的是稳定的对象地址,当对象被移动时候,只
windows 句柄理解
句柄是一个让你操纵某个对象的标识符。在windows中句柄有很多类型,有的是指针,有的是指向指针的指针,有的是一个数组索引。 但在编程中不需要在乎句柄是怎么样的,因为winapi调用掩盖了句柄操作的细节。为什么我们需要句柄?     更准确地说,是windows需要句柄。win
Java对象句柄(指针,引用地址)
Java中的术语 : 对象句柄 句柄(Handle),在Java中的任何东西都可以看做对象, 存在一种标识符实际指向一个对象的句柄. 在Java的其他地方或者数据中也有称为 "引用"或者 "指针". 只是一个引用地址, 我们不能认为Java中没有指针,其实这就是一个指针, 我们每次操作对象就是根据句柄去找到对象操作对象的. 即使没有对象,我们也可以让句柄单独存在. 例如: 创建Strin
JAVA中的术语:句柄是啥意思
句柄的本质:一个唯一的整数,作为对象的身份id,区分不同的对象,和同类中的不同实例。程序可以通过句柄访问对象的部分信息。句柄不代表对象的内存地址。 句柄和指针的区别:程序不能通过句柄直接阅读文件中的信息,指针是可以的。从所起的作用这点来说,句柄就是弱化后的指针,更安全,功能减少。 如果句柄不再I/O文件中,毫无用处。 餐卡链接:百度百科  点击打开链接 说了那么多,其实就是
系统的文件句柄数问题
在Linux下,我们使用ulimit -n命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。    对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象squid、mysql、java等单进程处理大量请求的应用来说就有点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files op
对象的访问定位:句柄与直接指针
对象的访问定位:句柄与直接指针Java程序通过栈中的reference数据来操作堆上的具体对象,而对象的访问方式取决于虚拟机的实现。主流访问方式有句柄和直接指针两种句柄方式Java堆中将会划出一块内存来作为句柄池,reference对象存储的就是对象的句柄地址。句柄中包含了对象实例数据和类型数据的具体地址:直接指针方式reference对象直接存储对象地址:两者对比句柄由于reference中存储的
在java程序中如何能获取到另一个程序的windows句柄,又如何使用这个句柄向这个窗口发送消息
import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.platform.win32.WinUser; import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
Ⅰ.5 如何使用事件句柄
在Squish测试脚本中有可能要对AUT内部发生的事件做出反应。这可能是有用的,例如,当对话框意外出现时 比如一个错误消息提示,提供一个测试脚本来响应它。可以通过注册一个事件句柄函数来实现该功能,当一个指定的对象、一个指定类型的对象或者任何对象的事件发生时,调用句柄。 事件句柄函数通过调用 installEventHandler 函数来注册。对于一个应用于所有AUT对象的句柄,即全局事件句柄,只