在函数传值时对于基本类型变量,Java是传值的副本;对于所有的java基本类型和引用类型区别变量如String等,Java都是传引用的副本
下面用几个实例来看一看基本类型和java基本类型囷引用类型区别的区别,实例分别尝试在函数中修改不同的入参验证是否能够通过入参来修改原始值。
传递基本类型变量时实际上是將参数值作为一个副本传进方法函数的,在调用的方法函数中不管怎么改变这个值,其结果都只是改变了副本的值而不会影响到源值。
stringBuffer是一个对象引用Java实际上将它的副本传进方法函数的,这个函数里面的引用副本指向的是对象的地址通过引用副本找到地址并修改地址中的值,也就改变了对象
函数修改String(面试常考)
strings.即String类是final类型的String的值在创建之后不能被更改。所以在执行value += "Cicada"时其过程为:首先系统会自動生成一个新的String对象,并把这个新对象的值设为HelloCicada"然后把这个对象的引用赋给str。既然对象都是新的那么就与原来的“Hello”没有任何关系。
- 主函数进栈string初始化。
- 调用changeValue方法进栈,将string指向的地址值复制一份给str。
- changeValue方法运行完毕value所指向的地址值已经改变,但string指向的地址值不变
函数交换两个引用(常见误区)
代码执行结果显示,swap函数并没有像预期的那样交换test1和test2原因是,调用swap方法时传递的引用并不是引用本身而是引用的拷贝。
所以swap函数只是交换了引用的拷贝并没有交换原拷贝。
- 主函数进栈初始化test1、test2。
- 调用swap方法进栈,拷贝test1、test2的地址
- swap方法出栈,test1、test2地址的副本被销毁
- 一个方法不能修改基本类型参数(实例一);
- 一个方法可以改变java基本类型和引用类型区别参数的状态(实唎二);
- 一个方法无法修改String类型的引用,因为String是final(实例三);
- 一个方法不能让原引用指向一个新引用因为方法入参传入的是引用副本(實例四)。