下午看到一个关于String是不可变类型的问题,虽然知道原理但感觉没法解释清楚。翻了翻《软件构造》当时的PDF,记录一下。
问题是关于String作为参数传递给被调函数后,在函数中对形参String的改变不会实际改变原来的String的值。
String是一个不可变类型。一旦被声明,始终指向同一个值。想要对String重新赋值需要创建一个新的String对象。那么String作为参数就相当于int, double这些基本类型做参数。
Java语言的参数传递:
1.按值传递(by value)
适用范围:8种基本数据类型、String对象
特点:在内存中复制一份数据,把复制后的数据传递到方法内部
作用:在方法内部改变参数的值,外部数据不会跟着发生改变
2.按址传递(by address)
适用范围:数组、除String以外的其他所有类型的对象
特点:将对象的地址传递到方法内部
作用:在方法内部修改对象的内容,外部数据也会跟着发生改变
如果想要改变按值传递的参数的值,可以通过返回值的方式实现;
如果想要不改变按地址传递的参数的值,可以将形参深拷贝。