永发信息网

string是值传递还是引用传递

答案:1  悬赏:50  手机版
解决时间 2021-04-01 19:50
string是值传递还是引用传递
最佳答案
你是C/C++或是VB转过来的吗?在Java中过多考虑引用(指针)和值之间的关系是步入歧途,这正是Java的设计者极力避免你考虑的问题。
你需要明白的是:
1、Java中所有方法的参数的传递都是“值传递”;
2、Java中所有对象类型的变量的“值”,本质上说,包含了Java堆中的实际对象的地址,你可以大体认为Java的变量对应了C/C++中的指针(其实这里面有更复杂的机制)。事实上,Java并不像C/C++一样明确的区分“值语义”与“引用语义”,Java栈中也不会存放任何对象的实体(这点与C/C++不同,C/C++栈中可以存放对象实体),所有的Java对象都是在堆中。

概念上的区别在于,我这里提到的“变量”是指Java栈中的内容,对应你说的“引用”;我提到的“对象”是指Java堆中的实体,对应你说的“值”。而一般Java教材中提到的“值传递”,是指这些“变量”的内容的传递,不是Java堆中的对象实体的传递。

你用字符串来做实验,并推广为所有Java对象的做法,并不是特别合适。Java的String类型有特殊的处理:所有编译期认识的字符串,都会被放到常量池,于是下面的语句:
a = "s";
b = "s";
a和b并不像其它对象一样有创建的动作,都是直接指向常量池中的"s",所以你可以得到a==b。而下面的语句:
a = new String("s");
b = new String("s");
是分别在Java堆中创建了2个对象,此时a!=b。

本质上说,对于基本数据类型(整数、字符等),Java的符号==,用于判断二者的值是否相等;对于对象类型,Java的符号==,用于判断两个变量是否是“同一个对象”,equals()方法才是用于判断两个对象是否相等。

你希望实现的swap逻辑,在Java中通常认为是无法实现的。拿你这个例子来说,swapValue()中的tmpValue无论怎么更改,只是改变tmpValue自己的内容(即不断指向不同的对象),并不会改变value中的内容(始终指向同一个对象)。这也是为什么Java最初说自己永远是值传递。你只有改变tmpValue指向的对象的值(通过调用这个对象的方法或是更改它的属性),使用value访问时,才能看到这些改变。

为了弥补这个缺陷,C#才加入了ref关键字,允许传入变量的引用(如果参考C/C++,C#传递的实际是二级指针,它的内容是栈中的变量的地址)。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
进入左转弯待转区后可以直行吗?
买的nike sf af1 中帮鞋,粘鞋的胶水在拉链里
x+1/x的最小值怎么求?求过程
在F盘安装了一个虚拟机,给虚拟机安装了一个
餐具,骨瓷类,普通瓷器餐具的优劣与区别有哪
一个楼盘只有一栋楼没有房屋预售许可证,其他
曹操生活在什么年代
高中物理 第一问为什么用2as和用s=vt+1/2
2015年唐县什么时间换驾照
心不存念是什么意思
抚顺纯鲜天湖啤酒多少钱一瓶,今天小卖店没算
intel主板上的C1E BIOS支持指的是什么?
好多年前办过中国和上海银行的信用卡,钱包被
果糖浆和奶茶该怎么实用
驳回上诉 维持原判 但是如果上诉方是胜诉方
推荐资讯
为什么我新买的戴尔笔记本,回来用鲁大师检测
GMAT想要送分的学校找不到该怎么办
自己一直用了五六年的手机号,想过一下户,但
急求剪力墙拉钩的计算方法,墙长3900 墙高280
安神补脑液和可乐相克吗?
武汉市统计局官网2014年社平工资是多少?
如何尽快成为六爻占卜高手
GFF电容触摸屏是什么意思?OGS全贴合技术和GF
什么是兰精粘胶纤维
领取养老金是不是想什么时候领都可以
高原彩的个人经历
张飞是非洲黑人吗?关羽是南亚红种人吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?