安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

为什么说函数只存在值传递ampampamp引用类型是什么

5月17日 碧落盟投稿
  1。例子一
  我们先来看几个例子。先来Java的吧。Java最假了。一般人都认为是引用传递(基本类型值传递)。所以我们又拿C做例子。
  写a,b是为了好区分开。其实写俩a都行。不好书面表达publicclassDemo{publicstaticvoidmain(String〔〕args){AanewA();System。out。println(初始化:a。name);a。System。out。println(init函数调用前:a。name);change函数传递init(a);结果?System。out。println(init函数调用后:a。name);}staticvoidinit(Ab){a被初始化了。。bnewA();}privatestaticclassA{S}}
  输出:初始化:nullinit函数调用前:maininit函数调用后:main
  结果是啥。如果真的是引用传递。那么为啥a。name为啥不是空呢。
  我用C给大家写一下。
  cincludeinclude
  
  classA{public:};
  voidinit(Ab){cout未改变的地址:bA();cout改变后的地址:}intmain(intargc,charconstargv〔〕){AanewA();cout初始化:coutinit函数调用前:init(a);coutinit函数调用后:return0;}
  输出初始化:init函数调用前:main未改变的地址:0xe699d0改变后的地址:0xe699d0init函数调用后:
  显然C和Java的表现是不一样的。为什么C赋值可以改变值。而Java却不是呢。
  我们先解释C的做法。
  我们init(Ab)做了啥
  首先是我们定义了一个变量AanewA(main),我没有写构造函数,假设的。
  此时传递给函数init(Ab),此时ba,a0xe699d0。所以呢b0xe699d0。
  后面我们的操作就是基于这个b的。此时我们将bA();,是不是将0xe699d0指针指向了A()对象呢(其实就是块内存,指向的是内存的首地址)。此时是不是修改了0xe699d0指针的指向呢。那么a也等于0xe699d0。所以a的值也被修改了。
  然后我们看看Java的做法。staticvoidinit(Ab){System。out。println(未改变的地址:0xInteger。toHexString(a。hashCode()));a被初始化了。。bnewA();System。out。println(改变后的地址:0xInteger。toHexString(a。hashCode()));}
  我们打印一下hashcode。因为Java的hashcode其实就是确定一个对象的唯一标识,如果你想深入了解hashcode的话介意看看JVM的源码,C和Java对象的映射关系(如果是对象地址的话,那么内存回收会改变大量的内存地址,难道还是地址吗,我们这里不考虑这个。只要知道这个是Java对象的唯一值类似于hash码)。
  输出结果:初始化:nullinit函数调用前:main未改变的地址:0x6e8cf4c6改变后的地址:0x12edcd21init函数调用后:main
  此时我们发现地址发生了改变。其实理解了上面C那部分聪明的就明白了。
  由于Java引用类型传递如果是Hotspot虚拟机则实现的就是简单的指针传递。这个变量指向Java对象的数据区域。
  由于一开始a0x6e8cf4c6(Java引用对象),然后函数赋值ba,此时b0x6e8cf4c6。
  关键点在于newA()地方;执行的是,实例化一个A对象,在栈顶开辟一块空间,将A对象保存在栈顶中,此时栈顶值0x12edcd21,然后将栈顶值存入到变量b中。此时b0x12edcd21。那么改变原来0x6e8cf4c6指向的内容了吗,并没有。
  我们再看看javac编译后的结果:staticvoidinit(com。jvm。reference。DemoA);descriptor:(LcomjvmreferenceDemoA;)Vflags:ACCSTATICCode:栈的深度需要3,变量表需要一个,参数一个stack3,locals1,argssize1实例化一个对象0:new2classcomjvmreferenceDemoA3:dup4:aconstnull调用构造方法5:invokespecial3MethodcomjvmreferenceDemoA。init:(LcomjvmreferenceDemo1;)V将栈顶值存入变量0中8:astore0返回9:return
  准确点说Java的做法是:如下操作。voidinit(Ab){cout未改变的地址:AaA();cout改变后的地址:}
  其实各种做法也有各种做法的好处。没有绝对的好坏。2。例子二
  其实你理解上面这个例子。你就明白了为啥值传递了。我们继续拿C说话。Java查看地址不方便。voidswap(inta,intb){couta:a,b:}intmain(intargc,charconstargv〔〕){intx1;inty2;coutx:x,y:swap方法。swap(x,y);coutx:x,y:codereturn0;}
  输出x:1,y:2a:2,b:1x:1,y:2
  我们发现为啥函数内部。a和b成功交换了地址。所以a和b的值就互换了。
  但是为啥呢。
  我们再次打印一下地址coutx:x,y:输出:x:0x61fefc,y:0x61fef8
  x0x61fefc,y0x61fef8,
  执行swap函数。此时a0x61fefc,b0x61fef8,
  然后经过一番操作,此时a0x61fef8,b0x61fefc。然后输出a2,b1,所以成功了。
  但是为啥x和y没变呢。是不是发现x和y依旧着原来的地址呢。
  正确的swap操作,必须修改指针指向的值。voidswap(inta,intb){}3。Java的引用类型
  创建对象自然是为了后续使用该对象,我们的Java程序会通过栈上的reference数据来操作堆上的具体对象。由于reference类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用,并没有定义这个引用应该通过什么方式去定位、访问到堆中对象的具体位置,所以对象访问方式也是由虚拟机实现而定的,主流的访问方式主要有使用句柄和直接指针两种:如果使用句柄访问的话,Java堆中将可能会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息,其结构如图22所示。如果使用直接指针访问的话,Java堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信息,reference中存储的直接就是对象地址,如果只是访问对象本身的话,就不需要多一次间接访问的开销,如图23所示。
  本文第三节引用自深入理解Java虚拟机。这两种对象访问方式各有优势:
  使用句柄来访问的最大好处就是reference中存储的是稳定句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。
  使用直接指针来访问最大的好处就是速度更快,它节省了一次指针定位的时间开销,由于对象访问在Java中非常频繁,因此这类开销积少成多也是一项极为可观的执行成本,就本书讨论的主要虚拟机HotSpot而言,它主要使用第二种方式进行对象访问(有例外情况,如果使用了Shenandoah收集器的话也会有一次额外的转发,具体可参见第3章),但从整个软件开发的范围来看,在各种语言、框架中使用句柄来访问的情况也十分常见。
  所以句柄访问方便管理,直接指针访问效率高,但是不方便管理。
投诉 评论 转载

为什么说函数只存在值传递ampampamp引用类型是什么1。例子一我们先来看几个例子。先来Java的吧。Java最假了。一般人都认为是引用传递(基本类型值传递)。所以我们又拿C做例子。写a,b是为了好区分开。其实写俩a都……中国移动想干什么?5G采购名单公布,华为跌倒高通吃饱在全球5G市场,华为是技术和设备最先进的厂商,尽管这两年来受到了以美国为首的,很多西方欧美国家的排挤,但是仍然能够保持领先的地位。而且随着海外地区的失利,华为逐渐将5G业务的重……iOS15。2使用现状,有人夸有人骂,深度使用之后我来告诉你iOS15自从发布之后,就饱受争议,有人说停滞不前,变化不大,有人说功能增加更流畅。我觉得,iOS15从15。1才开始比较稳定,15。2才算成熟。这不前两天苹果发布了iO……部分纯鸿蒙HarmonyOS应用已上线图标多了HMOS角标IT之家6月5日消息华为鸿蒙HarmonyOS2已经正式发布,但目前大部分带有HarmonyOS服的应用都是系统自带的应用,第三方应用适配的还比较少,但也并非完全没有。IT之家……助听器真的可以抑制耳鸣吗?应该没有作用,耳鸣可以通过一点的噪音遮蔽,比如说收音机就可以,助听器的噪音对听力正常的人来说能不能接受,要尝试了才知道。耳鸣往往是症状,需要排除相关疾病后,比如说血管性疾……百万跑分的vivo新机曝光!天玑9000处理器,vivoX8安兔兔跑分达到百万的手机是什么水平?虽说只有寥寥数款而已,但登榜的机型差不多都是大家耳熟能详的品牌高端旗舰,而近期榜单中却有一款代号为PD2186X的vivo新机赫然登榜,据悉……睡前泡泡脚,一夜到天亮?左点小仙足浴桶P7一段时间真实感受现在生活节奏越来越快,每天回到家就是沙发一躺,恨不得瘫一会儿,这时候如果有啥能够解解乏是最好不过了。左思右想,泡脚是一个不错的选择,网上的泡脚桶还是挺多的,各种各样,我有幸体验……中国工程院院士徐建国新冠病毒是自然原性,不可能是人工制造中新网北京8月13日电(记者黄钰钦)中国工程院院士、医学微生物学家徐建国13日在新冠病毒溯源问题驻华使节吹风会上表示,新冠病毒是自然原性,不可能是人工制造。他介绍称,从生……探访服贸会通信服务专题展5G新技术亮相在服贸会电信、计算机和信息服务专题展上,基于5G的新技术得到重点展示,全球首辆5G8K转播车现场展示转播技术。我们利用了5g加MEC的平台,对这些遗址公园进行了一个AI的……盘点国产手机的导航手势体验!双侧返回是亮点,单手党都默默点赞目前手机已经进入全面屏时代,用户日常用机习惯和用机小技巧都发生了很大变化。全面屏手机摈弃任何正面按键,手机系统也衍生出诸多用机导航方式。例如iPhone有经典的悬浮球功能,官方……苹果没有了对手,无敌多么寂寞来自新浪微博因为众所周知的原因,华为手机自去年底开始,已经大幅缩水锐减销量已成事实。而其它厂商也是借着华为销量腰斩的东风,顺势赚了一大波销量也是事实。但在真正的高端局面前……认知能力是一个人最核心的竞争力认知能力是一个人最核心的竞争力。字节跳动创始人张一鸣从Google到百度,从百度到阿里,几乎所有的古典互联网商业模式都是建立在用户主动搜索关键词基础之上的。但……
电信宽带,一根网线可以同时看IPTV和上网吗?iPhone8升iOS15。3续航有提升,推荐升级快手电商2022年战略升级新增大搞产业带战略当之无愧的国产之光DC评达音科禅吐槽佳能R6只有2000万像素的人是什么心态?这款相机到底怎锤子新品将至?坚果手机开始补货马斯克拿下推特后一位老对头默默删除了账户小米MIX4正式发布,全新陶瓷配色,4999起,满身黑科技去年为联想摇旗呐喊的项立刚,又在为汉芯造假事件翻案全球数治全球首份人工智能保障生态系统路线图的创见滴滴为什么要到美国上市?重磅!孟晚舟担任华为轮值董事长,国产手机新的机会来了?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利