Java 中的参数传递是按值还是按引用?
回答重点
在 Java 中,参数传递只有按值传递,不论是基本类型还是引用类型。
-
基本数据类型(如
int
,char
,boolean
等):传递的是值的副本,即基本类型的数值本身。因此,对方法参数的任何修改都不会影响原始变量。 -
引用数据类型(如对象引用):传递的是引用的副本,即对象引用的内存地址。因此,方法内可以通过引用修改对象的属性,但不能改变引用本身,使其指向另一个对象。
扩展知识
基本类型与引用类型的区别
- 基本类型:包括
int
,float
,double
,char
,boolean
等,存储在栈内存中。方法中对基本类型参数的操作只会影响传递的副本,原始变量的值不受影响。 - 引用类型:包括所有的对象和数组,引用类型的变量存储的是对象在堆内存中的地址。当引用类型作为参数传递时,传递的是这个地址的副本。因此,方法内的修改可以影响到传入的对象的内容,但不会影响对象引用本身的地址。
示例代码分析
![[Pasted image 20250114132446.png]]
- 在
modifyPrimitive
方法中,num
是基本类型的副本,因此对它的修改不影响原始变量a
。 - 在
modifyObject
方法中,obj
是引用类型的副本,但这个副本仍指向原始对象,因此修改value
属性会影响原始对象。 - 在
resetReference
方法中,obj
被重新赋值为一个新对象,这个变化只影响副本,不影响原始引用。
不可变类
关于引用的回答后,面试官可能会接着问不可变类。不可变类在多线程环境中不需要额外的同步控制,因为它们的状态一旦创建就不能改变。
String 类型作为形参时,是值传递还是地址传递
问题:
关于 String
类型作为方法的形参时,究竟是值传递还是地址传递?
解答:
在 Java 中,方法参数的传递方式是值传递。即使是 String
类型,传递的也是对象引用的值,并非直接传递对象本身或对象的地址。
具体分析
-
String 的不可变性:
String
在 Java 中是不可变类,一旦创建,其内容就不能修改。- 这意味着当我们对
String
类型变量进行操作时,实际上是在创建新的String
对象,而不是修改原有的对象。
-
值传递 vs 地址传递:
- 值传递:方法调用时,传递的是变量存储的值(对于对象,存储的是对象的引用值,而非对象本身)。
- 地址传递:如果是地址传递,方法中对对象的任何修改都会直接影响原始对象。
-
示例代码:
public class TestString {
public static void main(String[] args) {
String str = "Hello";
modifyString(str);
System.out.println("Main方法中的字符串:" + str);
}
public static void modifyString(String s) {
s = s + " World";