900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 主函数中调用返回值为void的函数 函数的参数传递规律

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

时间:2024-06-22 22:21:39

相关推荐

主函数中调用返回值为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指向该空间地址,后者则不管三七二十一直接开辟新空间。

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。