有些java书籍在介绍java中的传参时都说,不论是基本类型还是对象类型,都是传值。这种说法不能算错,但往往让很多初学java的人感到很困惑。因为这里所说的传值与c++中简单变量的传值已经不是同一个概念。
对于java传参,我觉得更准确一点的描述是,不论参数是什么类型,传递的都是参数的副本。
- 对于基本类型的变量,传递值的副本。
- 对于引用类型的变量(包括对象与数组),传递引用的副本。由于引用的副本与引用指向的都是同一个对象,因此对引用副本的操作仍然会改变对象的值。
值得注意的是,如果一个类是final类型,那么这个类的实例(即对象)是不可变的。当尝试通过该对象的引用对对象重新赋值时,java会生成一个新的对象并将该引用指向新的对象。因此之前的对象并没有发生任何改变。
因此当参数是引用类型时,如果该类型是final的,此时的传参看起来会和基本类型的传值差不多(不会改变原有对象的值)。但是实质上传递的还是引用的副本。
final类型的类包括:
- String类
- 基本类型的包装类,包括Integer、Boolean等