Java中的基本类型与引用类型

2019-04-23  本文已影响0人  寒_蝉

定义

在函数传值时,对于基本类型变量,Java是传值的副本;对于所有的引用类型变量,如String等,Java都是传引用的副本。

基本类型

引用类型

实例说明

下面用几个实例来看一看基本类型和引用类型的区别,实例分别尝试在函数中修改不同的入参,验证是否能够通过入参来修改原始值。

函数修改基本类型

代码

基本类型

运行结果

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(面试常考)

代码

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”没有任何关系。

执行逻辑

  1. 主函数进栈,string初始化。
  2. 调用changeValue方法,进栈,将string指向的地址值,复制一份给str。
  3. changeValue方法中,重现创建了一个String对象”HelloCicada”,并将str指向了新的地址值。
  4. changeValue方法运行完毕,value所指向的地址值已经改变,但string指向的地址值不变。
  5. changeValue方法弹栈。
  6. 主函数弹栈。

函数交换两个引用(常见误区)

代码

应用类型Swap

运行结果

Before swap:
1
2
In swap:
2
1
After swap:
1
2

结果说明
代码执行结果显示,swap函数并没有像预期的那样交换test1和test2。原因是,调用swap方法时传递的引用并不是引用本身,而是引用的拷贝。所以swap函数只是交换了引用的拷贝,并没有交换原拷贝。

执行逻辑

  1. 主函数进栈,初始化test1、test2。
  2. 调用swap方法,进栈,拷贝test1、test2的地址。
  3. swap方法内交换了test1、test2地址的副本。
  4. swap方法出栈,test1、test2地址的副本被销毁。
  5. 主函数出栈。

总结

上一篇 下一篇

猜你喜欢

热点阅读