大家好,又见面了,我是你们的朋友全栈君。
曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:“传参数就是值传递,传对象就是引用传递”,后面进一步查找了相关资料和文章以后,发现这么理解是不正确的。
这里先放结论:
要理解参数的传递就必须先理解形参和实参:
举个例子:
public static void main( String[] args ) {
String string = "Hello";
//string是实际参数
sout(string);
}
public static void sout(String str){
//str为形式参数
System.out.println(str);
}
理解了实参和形参,以及java对应的数据类型,我们就可以理解值传递和引用传递了。
对于这两种方式,网上有一个非常形象的图:
但是java的传值策略有点类似于两者的结合,是共享对象传递:
这也是之所以说java也是值传递的原因,共享对象传递实际上也是对实参进行拷贝然后赋给形参,但是操作针对的对象不是值而是地址!
由于传递的是地址的拷贝,所以如果你在方法中将这个地址指向了新的对象,实际上是没有任何对方法外是没有任何作用的,举个例子:
public static void main( String[] args ) {
Person p = new Person();
System.out.println("main中:" + p.hashCode());
change(p);
System.out.println("main中:" + p.hashCode());
}
public static void change(Person person){
person = new Person();
System.out.println("change中:" + person.hashCode());
}
//输出
main中:692404036
change中:1554874502
main中:692404036
可以看到在main
方法中输出的hashCode指向的都是同一个对象,而change
中指向了另一个,可以这么理解:
change
方法中的形参pchange
中p指向了一个新的Person对象,在change
这个函数范围里p指向的就是new出来的第二个Person对象的地址change
中的p实际上是main
中p的拷贝p‘,所以在change
里p’指向的改变对main
中的p不会有任何影响你在福建有座仓库,给自己配了一把钥匙
1.三种传递:
2.共享对象传递的特点:
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170798.html原文链接:https://javaforall.cn
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有