主函数中调用返回值为void的函数,函数的参数传递规律

参数为基本类型(int/char/…)

public static void main(String[] args){
     int a=0;
     hs(a);
     System.out.println(a);
}

public void hs(int a){
     a=77;
}

运行的结果为a=0,也就是调用外部函数没有效果。

个人的理解是:如果是基本类型的话,hs函数里,只是用了一下数值,对主函数里的变量a没有任何影响。

ps:基本类型是值传递,引用类型是地址传递。(修正:Java里只有值传递的概念)

参数为引用类型(List/自定义类/…)

主函数内变量改成:List list=new ArrayList<>(); 或者自定义树的结点: TreeNode t=new TreeNode();
被调用的函数对其进行 list.add()操作,或者t.val=5的操作,运行结果是:生效了

个人理解是:传递的是对象的指针,对该地址上的数据直接进行修改,所以会永久生效。

参数为引用类型(Integer/String/…)

主函数内变量改成:Integer i=0;
被调用的函数对其进行 i=7;的操作。运行结果是?不生效。

个人理解:这也是我迷惑了一晚上的问题。同为引用类型,为什么Integer修改后就不生效呢?实际上,i=7,并不是把原来地址上的数去抹除再改成新的数据。实质上是i=new Integer(7),也就是重新开辟了空间,把指针i重新指向新的空间地址。String比较特殊,String类是被final修饰的,所以是不可被继承的,本质上不允许修改。str="xxx"实质上是编译期间JVM去常量池里找,找到了直接引用,找不到就在常量池开辟空间。运行期间在栈创建指针指向常量池。所以被调用函数中把String类型参数修改为其他内容的话,是在常量池中新开辟了空间并把栈中指针指向了新的空间。
这样的话,原来地址的内容并没有改变,所以主函数里输出i,内容也不会改变了。

ps:Integer i=7 和 Integer i=new Integer(7) 效果基本上一样,都是开辟空间并指向i罢了,略微的区别是如果之前已经定义了i=7,前者会直接把i指向该空间地址,后者则不管三七二十一直接开辟新空间。

这是本人心血来潮写的第一篇博客,各位看官将就着看呗,欢迎评论批评指正,不过我估计好久才会看到消息。。。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值