必踩的坑之Java方法中形参实参传递
首先亮明Java中方法参数传递的规则,这两点很重要: 如果实参是基本类型(包括包装类型)或者String,则实参不会变(传的是值); 如果实参是对象集合或者数组,则实参会改变(传的是引用)。
上面这两条比较简单,笔者就不展开说了,这里只说一点,关于方法中引用的传递,很多人会踩坑,如下:
我们先以数组举例,如下代码,很简单的几行,大家猜一下会最终输出的结果是什么样子的呢?
public class PassByValueDemo {
public static void main(String[] args) {
int[] i = {0};
new PassByValueDemo().Demo(i);
// 这个地方还是0
System.out.printf(Arrays.toString(i));
} public void Demo(int[] i){
// 这个实参为数组,传的是引用,其值会改变??? nonono,只是在这个方法中改变了,回到main方法栈中还是{0}。
i = new int[]{1,2,3};
System.out.println(Arrays.toString(i));
}
}
根据第二条规则如果实参是对象集合或者数组,则实参会改变(传的是引用),大家很容易想到,这个实参为数组,传的是引用,其值会改变,那就大错特错了。这个只会在方法中短暂改变数组的值,回到main方法栈中还是{0}。
实际输出如下:
[1, 2, 3]
[0]
Process finished with exit code 0
为什么会这样呢?具体分析如下: 我们先看main方法中第一行操作int [] i ={0},这个操作会在内存中开辟一个4字节大小的内存空间,然后返回其该数组的首地址,我们假设该数组的首地址值为0x1111,那么此时i就指向了内存中0x1111这么一个空间。内存地址为0x1111的空间存储了0; 继续往下指看,调用Demo方法,此时会保存mian方法栈的状态,包括i在mian方法中指向的内存空间,这里点很重要,很重要,重要,重要的事情说三遍。 在Demo方法中 new Int[] {1,2,3},这个操作会重新在内存中开辟一个空间,然后返回该数组的首地址的值,我们把这个地址值假设为0x2222,内存为0x2222存储了1,2,3;此时i的值指向了0x2222;那么这个时候输出i,当然会打印1,2,3; 执行完了Demo方法,我们回到main方法中,此时从虚拟机栈中恢复刚才进入Demo方法前保存的栈信息,在进入Demo方法前i是指向0x1111这么一个地址空间,进入前已经保存了栈中的局部变量表中(局部变量表可参考笔者该篇博文:点击我),我们现在取出来,那么i的指向的就是0x1111,而不是0x2222,此时打印的是0x1111指向的值,也就是0;
虽然我们不能改变引用地址,但是可以改变引用指向的地址空间里的值,如下:
public class PassByValueDemo {
public static void main(String[] args) {
int[] i = {0};
new PassByValueDemo().Demo(i);
System.out.printf(Arrays.toString(i));
}
public void Demo(int[] i){
i[0] = 1;
System.out.println(Arrays.toString(i));
}
}
输出结果:
[1]
[1]
Process finished with exit code 0
熟悉C或C++的同学可以类比int *const(允许更改存储在地址中的值),而不是int const*(允许指针指向其他地址)。
PHEV车型的五大好处现在对很多即将要购买新车的车主而言,因为上牌难的问题头疼着。随着越来越多的新能源车型推出市场,能解决上牌难的问题,不少消费者开始将购车目标锁定在新能源车上。除了解决上牌难的问题外,
瞄准影像芯片国内手机厂商加大自主研发力度来源人民网当前,随着短视频产业快速发展,用户越来越重视视频拍摄的质量,对手机提出了更高的摄影要求。可以看出,未来消费者不仅需要手机拍摄分辨率更高帧率更高的视频,还需要手机能实时对视
荣耀手表GS3官图发布,极简风格圈粉潮流达人在前不久的荣耀Magic3系列发布会现场,荣耀手表GS3也迎来了首次亮相,虽然目前还未上架开售,也未正式揭晓价格,但仅仅是公布的实拍图就足够让网友们感到惊喜了。根据荣耀智慧生活官微
别太相信销量说,以三款手机举例说明,聪明人更看重体验最近看到有一名用户表示销量高的手机一定不会差,不然不会这么多人买。这句话显然很片面,销量高不等于体验好,同样销量低的机型也不是说就值得买,而是要结合自身使用需求,剖析一款产品的优缺
为抢占市场拼了!这五款手机8月底大降价,最低仅需2899元2021年,对于国内智能手机市场来说是最具特色的一年,随着昔日王牌巨头的市场逐步缩减,各大智能手机品牌纷纷开始寻求全新的突破,以便能够在短时间内迅速提高自身的市场份额。进入八月之后
借开放超充网络布局充电市场,特斯拉胜算几何?近日,特斯拉掌门人埃隆马斯克在其个人推特上表示,特斯拉将在今年晚些时候向其他电动汽车开放其超级充电站网络。当前,特斯拉在全球范围内已经拥有超过2500座超级充电站。一旦对外开放,将
移动支付两大巨头登热搜,资金放在支付宝里真的安全吗?欧界报道前段时间,因为阿里女员工的事件,阿里频频登上热搜,可以说存在感很足了,而近段时间的娱乐圈,似乎也不太平。从吴某凡入狱之后,娱乐圈迎来了大变动!很多艺人接连被封杀,而最令我们
俄最高法院拒绝在全国境内禁售苹果手机(观察者网讯)据俄罗斯卫星通讯社8月31日报道,俄最高法院民事审判委员会在法院判决数据库中发布的相应裁判书显示,该院已经拒绝在俄罗斯境内禁售苹果公司产品。报道称,俄罗斯发明家阿尔塔
广汽埃安超倍速随充随走,中国电动汽车的首个超充技术8月30日,广汽埃安正式发布了超充技术超倍速电池技术及A480超充桩,石墨烯基快充锂电池配合48kW超充桩,创纪录实现充电5分钟续航207公里,让充电像加油一样快,新能源汽车正式进
俄最高法拒绝全境禁售苹果手机据俄罗斯卫星通讯社8月31日报道,俄最高法院民事审判委员会在法院判决数据库中发布的相应裁判书显示,该院已经拒绝在俄罗斯境内禁售苹果公司产品。新华社记者才扬摄报道称,俄罗斯发明家阿尔
4亿大单!中兴中标,华为出局2021年8月4日,中国移动2021年至2022年PC服务器集中采购(网络云标包)招标公告发布,采购X86服务器14836台。项目不划标包,原则上12家供应商中标,若中标厂商为1家