一、首先测试java中函数参数传递后,重新赋值后,看结果是否改变
先测试基本类型:
执行结果:
再看对象类型:
对象类型的结果:
结合上面的测试结果,我们知道,当函数接收一个参数后,在函数内部重新赋值,并不影响函数外面的对象。
那要想通过函数修改一个传递进来的参数的值怎么解决呢,只能通过包装一个对象或者数组,当修改传进来的对象中的属性的时候,就是修改的函数外部的对象内部的属性。
看结果:
结果显示:修改函数参数对象内部的字段的值,就是修改的外部传递参数的值,这也就证明了java的函数参数 是值传递:函数参数创建一个临时变量,值是传过来的值,如果是基本类型,就是直接传递参数的数值,如果传递的是对象,那函数创建的变量就指向传递对象的引用,也就是说形参指向实参的地址。
二、从上面的值传递看java中try-cache中有return情况,然后在finally中也有reutrn或者在finally中修改前面return的变量的值。
1、try和finall中都有reuturn 看测试案例
结果:
结果:
我们看到,无论返回的是基本类型还是对象类型,finally中的renturn都会覆盖前面的return
2、我们再看return后在finally中又修改return中的值。
结果我们看到,无论是基本类型还是对象类型,return后,在finally中重新赋值,都不会改变返回值。
那如果修改返回对象内部字段的值呢:
结果显示:return对象后,修改内部的字段,结果变了。
为什么呢?
原来和上面函数参数一样的,java是值传递。当return的时候,这个时候还没有真正结束函数,return指令会把return的参数放到局部变量表中,基本类型和对象类型都是创建一个形参来接收实参。当在finally中再次return的时候,会再一次把变量放入到局部变量表中覆盖。但是当重新赋值的时候,改变的形参和实参互不影响,但是如果该的是对象内部的字段就会有影响了。
综合来说就是两点原因: 1、java的值传递 2、return是将实参传递给局部变量表的形参。 3、finally执行后函数才算结束