Java中的基本类型与引用类型
定义
在函数传值时,对于基本类型变量,Java是传值的副本;对于所有的引用类型变量,如String等,Java都是传引用的副本。
基本类型
- 整型:byte,short,int,long
- 浮点型:float,double
- 字符型:char
- 布尔型:boolean
引用类型
- 数组
- 类
- 接口
实例说明
下面用几个实例来看一看基本类型和引用类型的区别,实例分别尝试在函数中修改不同的入参,验证是否能够通过入参来修改原始值。
函数修改基本类型
代码

运行结果
Before Change Value : int = 1
In Change Value : int = 2
After Change Value : int = 1
结果说明
传递基本类型变量时,实际上是将参数值作为一个副本传进方法函数的,在调用的方法函数中,不管怎么改变这个值,其结果都只是改变了副本的值,而不会影响到源值。
函数修改引用类型
代码

运行结果
Before Change Value : StringBuffer = Hello
In Change Value : StringBuffer = HelloCicada
After Change Value : StringBuffer = HelloCicada
结果说明
stringBuffer是一个对象引用,Java实际上将它的副本传进方法函数的,这个函数里面的引用副本指向的是对象的地址,通过引用副本找到地址并修改地址中的值,也就改变了对象
函数修改String(面试常考)
代码

运行结果
Before Change Value : String = Hello
In Change Value : String = HelloCicada
After Change Value : String = Hello
结果说明
String的API中有这么一句话:
Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings.
即String类是final类型的,String的值在创建之后不能被更改。所以在执行value += "Cicada"时,其过程为:首先系统会自动生成一个新的String对象,并把这个新对象的值设为HelloCicada",然后把这个对象的引用赋给str。既然对象都是新的,那么就与原来的“Hello”没有任何关系。
执行逻辑
- 主函数进栈,string初始化。
- 调用changeValue方法,进栈,将string指向的地址值,复制一份给str。
- changeValue方法中,重现创建了一个String对象”HelloCicada”,并将str指向了新的地址值。
- changeValue方法运行完毕,value所指向的地址值已经改变,但string指向的地址值不变。
- changeValue方法弹栈。
- 主函数弹栈。
函数交换两个引用(常见误区)
代码

运行结果
Before swap:
1
2
In swap:
2
1
After swap:
1
2
结果说明
代码执行结果显示,swap函数并没有像预期的那样交换test1和test2。原因是,调用swap方法时传递的引用并不是引用本身,而是引用的拷贝。
所以swap函数只是交换了引用的拷贝,并没有交换原拷贝。
执行逻辑
- 主函数进栈,初始化test1、test2。
- 调用swap方法,进栈,拷贝test1、test2的地址。
- swap方法内交换了test1、test2地址的副本。
- swap方法出栈,test1、test2地址的副本被销毁。
- 主函数出栈。
总结
- 一个方法不能修改基本类型参数(实例一);
- 一个方法可以改变引用类型参数的状态(实例二);
- 一个方法无法修改String类型的引用,因为String是final(实例三);
- 一个方法不能让原引用指向一个新引用,因为方法入参传入的是引用副本(实例四)。