java中的操作句柄的问题

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

0

3个回答

 首先,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,则还是按值传递。


0
u010775468
键盘手C 哦哦,万分感谢,差不多懂了,感觉我的好多问题都有您的回答啊,真是谢谢了!
大约 3 年之前 回复
caozhy
贵阳挖掘机马善福,自备车辆专业挖游泳池 回复键盘手C: 是的。还有什么不清楚的么?
大约 3 年之前 回复
u010775468
键盘手C 哦哦,引用就是相当于是一个地址,指向这个对象的地址吗?
大约 3 年之前 回复
caozhy
贵阳挖掘机马善福,自备车辆专业挖游泳池 回复键盘手C: 两者是一样的,拷贝的是引用,而不是对象。
大约 3 年之前 回复
u010775468
键盘手C 谢谢您写的这么详尽,但是最后一点我还是不懂,对于值得传递而言,只要对于同一个空间进行操作,那么另一个指向这个空间的对象值也会随着改变,但是对于函数而言,值得传递就是相当于copy一份?,那么是不是可以理解为A a这个参数只是一个复制过来的,所以操作是不会改变原值的,但是为什么第二个例子只是包装了下反而就可以了呢,实在不好意思,有点困惑,麻烦您能解释下吗
大约 3 年之前 回复
 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也跟着改变。误以为是引用传递,但实际这是因为指向的是同一个对象而已。
1
u010775468
键盘手C 哦哦,那简单点说的话,这个A.a就是相当于定义一个A类的对象a?就算不用new关键字,还有如果返回值仅仅是普通类型的话,是不是是不会修改原值的,还有是不是只要是涉及到对象的问题,参数传递,还有对于另一个对象的引用,传的值都是原值,不知道这样理解对不对,麻烦您了,如果您还知道什么时候涉及到传递原值的话,还望您能补充补充,谢谢
大约 3 年之前 回复
danielinbiti
danielinbiti 回复键盘手C: 如果返回值是对象,改变对象内的属性,那可以通过操作a,改变a内部的属性的方式改变原有对象的属性值
大约 3 年之前 回复
danielinbiti
danielinbiti 回复键盘手C: 看你怎么定义了,如果是对象,那就是对象,如果定义成int那就是一个基本类型变量,像我上面举的例子就是类对象。
大约 3 年之前 回复
u010775468
键盘手C 谢谢, 那么就像您举得例子,这个A a = B .方法应该怎么理解呢,您之前说是地址,那么如果我要对这个B,方法的返回值进行操作的话,是不是可以用a调用(顺便问下这个a是什么?是对象?还是仅仅是一个变量?)
大约 3 年之前 回复
danielinbiti
danielinbiti 回复键盘手C: 传递对象,操作对象内属性,是会传递前对象的原值的。如果不是修改对象的属性,只是对对象变量重新定义或者赋值,则原对象不会改变。 int等基本类型只是入栈,可以认为是copy一份,于原值不是一份
大约 3 年之前 回复
u010775468
键盘手C 首先谢谢您的热心回答,那么在一个方法中,如果这个时候函数的参数的传递是对象的话,是不是在这个方法中如果对这个对象中得值进行了修改,是不是原来的值就会改变?还有函数的参数的传递如果是int等基本类型的话,是不是都是copy一份,原值不改变的?
大约 3 年之前 回复

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

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java中对象句柄
Java 句柄学习
Java+selenium学习日志(4):句柄与鼠标操作
    在上篇文章里,提到了一个切换句柄的功能,切换句柄实际上就是切换网页的窗口。为什么需要切换句柄呢?因为计算机与真实的用户不一样,用户可以打开新的窗口之后,就可以直接在新的页面进行操作,而计算机在打开一个新的页面之后,它所操作的句柄并不会自动的跳转到新的页面之中,而是在原先的句柄中进行操作。简单来说,计算机就只是完成打开一个新页面的过程,影响到的是原来的...
对Java中的对象、实例、句柄、直接指针的理解
        虚拟机在创建对象的时候,会优先查询常量池中是否有该对象的实例,如果没有则需要加载、解析、初始化class,然后分配内存,初始化内存,设置对象(HASH CODE 、 GC年代等),最后执行init才算是创建完对象。nn        对象即实例。nn        String str;nn        以上的str就是一个句柄,但是并没有指向任何对象,好比这是一个客服中心,告诉...
记录一次Linux下应用句柄泄露问题
目前在做公司的一个小项目,主要是做数据转发一块,需要在本地开启一个端口接收数据,然后传给消息中间件,服务用的底层跟消息中间件是一样的,都是netty,在服务测试时发现,当真实服务器连接上之后,服务的连接数一直在上涨,并且用lsof命令查看服务的open files也在上涨,平均10秒钟上涨10个左右。nn刚开始查看服务器系统参数发现,因为是新的服务器,没有改open files的数量,先改为100
web自动化 句柄的切换
nowhandle = self.driver.current_window_handle # 获取当前窗# 新开标签页allhandle = self.driver.window_handles # 获取所有窗口nfor newhandle in allhandle:n if newhandle != nowhandle:n self.driver.switch_to_w...
Java对象句柄(指针,引用地址)
Java中的术语 : 对象句柄rn句柄(Handle),在Java中的任何东西都可以看做对象, 存在一种标识符实际指向一个对象的句柄. 在Java的其他地方或者数据中也有称为 "引用"或者 "指针". 只是一个引用地址, 我们不能认为Java中没有指针,其实这就是一个指针, 我们每次操作对象就是根据句柄去找到对象操作对象的. 即使没有对象,我们也可以让句柄单独存在.rn 例如: rn创建Strin
selenium 多窗口、句柄处理
前言 n有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了。获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了。本篇以打开百度新闻页面搜索按钮上的链接页面为例,依次打开每个按钮,并检验测试结果。用脚本批量操作,可以减少重复劳动,重复的事情让脚本去执行吧!一.定位一组元素1.打开百度首页面:http://www.baidu.c
Java中什么是句柄
句柄:在java中我们在实例化完对象后,在对其进行操作时,用来去操作对象的就叫做句柄。他代表了当前对象的唯一一个标识,并不能代表当前对象的内存地址。nn例如:nnnTree t1 = new Tree();nn上边例子中,t1就属于当前新建对象的句柄,它指向新建对象的实例,我们通过他去操作对象。...
C++ 句柄类
C++中的访问控制允许类的实现和类的接口分开,使得客户程序不能轻易访问私有实现部分,但是实现部分的隐藏不彻底,可能导致一些问题。nn1)头文件的成员声明可能暴露信息,可能会有恶意访问,恶意篡改,存在安全隐患nn2)在设计初期,实现部分经常需要改动,就连头文件类的私有成员声明也时不时需要修改。这意味着程序员不论何时修改了一个类,都将重新编译包含了该头文件的所有文件,可能还要修改接口,增加不必要的编译...
Java中句柄初始化的三种方法
Java中句柄初始化的三种方法:n(1) 在对象定义的时候。这意味着它们在构建器调用之前肯定能得到初始化。n(2) 在那个类的构建器中。n(3) 紧靠在要求实际使用那个对象之前。这样做可减少不必要的开销——假如对象并不需要创建的话。
对象的访问定位方式:句柄、直接指针
建立对象是为了使用对象,我们的Java程序需要通过栈上的reference引用来操作堆上的具体对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位、访问堆中的对象的具体位置,所以对象访问方法也是取决于虚拟机的实现而决定的。目前主流的访问方式有使用句柄和直接指针两种。nn什么是句柄n句柄是指针的指针,句柄实际上是一个数据,是一个L...
PHP句柄
啥是句柄??就让我们来解释解释rn句柄就是操作某个对象的资源,即操作某个目标的,句柄就是回调函数。rn句柄(handle)也可以理解为把手。拥有把手就相当于拥有资源。针对句柄进行操作就等于顺藤摸瓜操作资源。rn实际上对象在内存地址中不是固定的,固定的句柄指向相应对象内存中所在的地址。rn也可以说句柄是一种通道,一个保持着某种状态的对象。rn一个资源在某种特定的性致下无法直接使用,所以使用句柄来操作
C#利用句柄操作窗口
C#利用句柄操作窗口
c#窗口操作-句柄操控全解
using System;nusing System.Collections.Generic;nusing System.Linq;nusing System.Text;nusing System.Windows.Forms;nusing System.Drawing;nusing System.Drawing.Drawing2D;nusing System.Runtime.InteropServi
客户端程序出现句柄泄露时查找办法
背景 n 有些客户反应客户端程序操作一段时间后,查看任务管理器发现客户端程序占用句柄数过多,怀疑存在句柄泄露问题。针对该问题,现场测试多个场景,把出现问题的范围缩小。现发现在以下两个场景下,会出现句柄泄露: n1、 打开客户端程序后操作交易 n2、 在文本框中切换输入法(百度输入法2.10版本) n使用handle.exe收集数据并分析后,已经确定是由于客户端程序中使用键盘钩子与百度输入法
C# 窗口、控件句柄操作
最近在程序中需要用到摄像头以及视频的展示和播放,大多数SDK运用的窗口和句柄,在winform程序中很简单,直接要用到的元素或者控件点handle就行了,但是由于winform的界面实在的跟wpf比起来,真的后者要好很多,因此能不能也在wpf中操作了,为此我度娘了下!n   其实在wpf下操作也很简单,不过稍微要麻烦点:n引入命名空间:System.Windows.Interopn获取窗体的
如何通过C#来操作文件句柄
首先,来说一下什么是文件句柄。百度百科的解释是:在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,...
python文件句柄的使用
rn今天写代码时,犯了一个低级错误。但这个的bug,很难发现。贴出有bug的代码,提醒自己。rndef calc(fd,type):rn normal_obj_num = 0rn all_obj_num = 0rn #fd.seek(0)rn for line in fd:rn arr=line.split()rn if arr[1] == ty...
c#通过句柄控制IE浏览器
c#通过句柄控制IE浏览器,这是个工具相当于外挂之类的,大家可以参考学习下
MATLAB绘图属性操作--学会使用句柄
前言 MATLAB的绘图功能十分强大,可以绘制各种各样的图形,数据可视化十分强大,但有时,采用默认的绘图属性,图形的形式符合我们的要求,学会使用图形句柄,并利用句柄修改属性是十分重要的。nn1.句柄之间的关系nn 在MATLAB中figure有句柄,axis有句柄,line,bar,plot等都有句柄,我们首先要搞清楚这些句柄的继承关系,才能找到正确的句柄并修改其属性的...
文件句柄数递增问题排查
最近在redis的项目中,存在打开的文件句柄数递增的现象,当超过设置的单进程最大文件句柄数时出现进程挂死,解决问题迫在眉睫;本身这个项目的文件句柄数不会超过100,更加坚定有问题,首先查看当前服务器打开的文件句柄数汇总情况:/usr/sbin/lsof -n | awk '{print $2}'|sort|uniq -c|sort -nr|more首先根据汇总情况查看你的服务进程占用了多少个文件句柄
Java+Selenium3方法篇19-获取浏览器窗体的句柄
先来解释下什么是句柄,有时候浏览器的窗口句柄,也叫windows id,英文单词更好理解。你打开了一个浏览器,你开一个tab,就生成了一个id,这个id直到你关闭这个tab才会消失。如果你在一个浏览器上打开多个tab,那么就有多个windows id,为什么你关闭其中一个tab,但是不影响其他tab的显示,就是这个id的作用。本文就是要介绍如何或者浏览器窗体的句柄或者叫编号,为后面的driver实
MFC中窗口句柄总结
对于同一个窗口而言,其指针是pWnd,句柄是hWnd,ID是nID,其三者转换关系如下nnnn指针->句柄:hWnd = pWnd->GetSafeHwnd(); nID->句柄:hWnd = ::GetDlgItem(hParentWnd, ID); n句柄->指针:pWnd = CWnd::FromHandle(hWnd); nID->指针:pWnd = Cwnd::GetDlg
Qt通过句柄操作外部窗口
之前很长时间内用的都是MFC,后来VC的多线程与内存泄露让我焦头烂额,牵扯东西太多,于是乎,转战qt了。n编程过程中,不可避免要操作外部窗口,MFC中操作窗口用的都是CWND::fromHandle();nqt中操作外部窗口与CWND对应的是QWindow类。nn HWND hwndLogin=FindWindow(NULL,L"登录");n QWidget* widgetL
python下spy++句柄使用
抛出问题rn1、spy++下得到的句柄如何使用?rn2、没有标题的窗口如何使用FindWindowEx得到句柄rn3、同类型的控件如何区分rn4、层数过多如何快速得到对象rn答:都可以直接使用句柄定位rnrnrn在做一个自动化工具时候,发现很多窗口没有标题,因为findWindowEx第四个参数用标题定位很方便,也基本是唯一。于是不得不继续研究findWindowEx这个函数。rnFindWind
句柄的使用(一)—— 点击不可点击按钮和修改按钮标题
在Window系统中,有些窗口的按钮可能没办法按下去(例如有些软件的功能按钮要付费才能使用),我们可以通过给按钮的“句柄”发送鼠标点击消息来破解 .例如鼠标属性窗口: n1、打开vs中的工具中的spy++ n2、点击工具栏中“搜索”的“查找窗口(alt+F3)”,调出窗口搜索界面,然后把“查找窗口工具”右边的图标按住放置到要点击的按钮上,即可获取该按钮的句柄。 n3、给按钮发送鼠标点击消息:#inc
解决进程文件句柄泄露导致磁盘空间无法释放问题
解决进程文件句柄泄露导致磁盘空间无法释放问题nnnn问题的产生nn今天突然接到一台服务器磁盘空间使用率达到90%的报警,于是登陆机器查看磁盘使用情况,发现确实外挂到/data的一块磁盘使用率达到了90%:nnnn[root@awsuw7-46 data]# df -hnFilesystem Size Used Avail Use% Mounted onn/dev/xvda2 ...
线程泄露问题解决(参考)
一、发现问题nn      生产环境,服务程序连续运行一段时间后(一般不超过一天时间)就会出现服务器卡顿,使用ssh远程登录都失败的情况。nn       初步分析认为,这种情况是服务器资源严重不足导致,比如:cpu使用100%,内存严重不足导致频繁缺页中断增加磁盘I/O,以及网络连接数暴增等。nnnn二、定位问题nn       登录服务器,查看cpu, 内存等使用情况。
python中的句柄
python和matlab一样,可以创建函数的句柄。比如:rnwindow = turtle.Screen()rnwindow.bgcolor(‘blue’)rnwindow.exitonclick()rnwindow就是一个句柄。rn句柄就是将直接调用改为间接调用,以避免每次调用的时候在库里搜寻,提高调用速度。可以这样理解吗?rnrn...
Windows句柄的理解
在Windows中,内核对象的数据结构只能由操作系统访问,应用程序不能在内存中定位这些数据结构并更改其内容。因为这个限制,Windows提供了一组接口函数以恰当的方式来访问这些内核对象的数据结构,句柄的概念由此产生。rn当调用了一个会创建内核对象的函数后,函数会返回一个句柄,标识所创建的对象,这个句柄可供进程里面的所有线程使用。在进程初始化的时候,系统会为它分配一个句柄表,句柄表里面的结构通常包含
JDK1.7方法句柄学习
package com.dedu.wayofpractice;import java.lang.invoke.MethodHandle;nimport java.lang.invoke.MethodHandles;import java.lang.invoke.MethodType;/**n * @author dedun * 描述:方法句柄是Java7为间接调用方法而引入的新API, 同Java的
MFC 跨线程访问控件方法和窗口之间的自定义消息
一:跨线程访问控件方法(在线程中)nn nn   CWnd* h_d = AfxGetApp()->GetMainWnd(); //获取主窗口的句柄nn   //h_d->GetDlgItem(IDC_APOETRY_EDIT)->GetWindowText(str); //IDC_APOETRY_EDIT为编辑框的IDn    h_d->GetDlgItem(IDC_ED...
C#操作窗口类(句柄操作)
C#写个类操作窗口(句柄操作) 实现过程: 过程一:找到当前鼠标位置的句柄 您的使用2个WinAPI(俺喜欢自己封装下来用):
java7新特性之方法句柄MethodHandle使用
JDK6之前我们会使用java反射来实现动态方法调用,多数框架用反射的比较多,例如mybatis、spring等。在JDK7中,新增了java.lang.invoke.MethodHandle(方法句柄),称之为“现代化反射”。其实反射和java.lang.invoke.MethodHandle都是间接调用方法的途径,但java.lang.invoke.MethodHandle比反射更简洁,用反射
mina 文件句柄数太高分析与解决
2014-11-01 19:43:12,997  WARN (AbstractConnector.java:472) - njava.io.IOException: Too many open filesnat sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)nat sun.nio.ch.ServerSocketChannel
对象和句柄
1,图形对象是系统中最基本、最底层的单元(类似DOM对象,分层,树状结构) n2,句柄是对象的标识,根屏幕用0代替,图形窗口的句柄为整数,其他对象的句柄为浮点数
vb取得窗体及控件句柄
vb6开发的取得任意窗体或者控件的句柄程程序,能将取得的句柄显示出来。对于各位朋友可能有所帮助
selenium自动化测试 获取两个窗口切换
selenium基于python来获取两个窗口与切换nn'''获取句柄'''ndef ss_switch(self,d):n '''获取当前句柄'''n window = d.current_window_handlen print(window)nn # 获取当前窗口句柄集合n windows = d.window_handlesn print(windows
句柄(Handler)到底是什么?
句柄毫无以为是编程学习中最头疼的翻译之一。这个词最初的来自形式语言中的handle,在英语中,handler的一个意思可以理解为“someone who is a manager of your life that trying to manipulate aspects of your life”,或者“one that handles something”,当然这是把它当成人来看了。但总之ha...
python的文件句柄一次只能用一次
最近用python时遇到了一个问题, 我用infile=open(sys.argv[1],'r')打开一个句柄,第一次时prepare_chr函数调用了infile,紧接着是process函数调用了它,但是输出的结果是,prepare_chr能读取infile的信息,而process函数里面无法读取infile的内容!!!rnrnrnrnrn后来才发现,用open打开一个文件句柄,只能被调用一次,
文章热词 Java 双目视觉问题 特征点问题 相机标定问题 最优化问题
相关热词 c#后台操作句柄 c# 句柄操作窗体 dreamweaver 的各种操作问题 python句柄教程 区块链问题