Java是值传递还是引用传递
在Java编程语言中,方法参数的传递总是按值传递的,这意味着不管一个变量是基本数据类型还是引用数据类型,传递的都是一个副本。
对于基本数据类型(如int、float等),这个副本就是数据值本身。因此,当你在方法内部改变这个值时,原始的变量不会受到影响。
对于引用数据类型(如对象),传递的是引用的副本,这个副本和原始引用指向同一个对象。因此,如果在方法内部改变了引用指向对象的状态(即改变了对象的字段),那么原始引用所指向的对象也会被改变。但如果你在方法内部改变了引用本身,使其指向一个新的对象,那么原始引用仍然指向方法外部的原始对象。
以下是一个简单的例子来说明这一点:
public class Test {
public static void main(String[] args) {
int num = 10;
StringBuilder strBuilder = new StringBuilder("Hello");
// 传递基本数据类型
changePrimitive(num);
System.out.println(num); // 输出10,num的值没有改变
// 传递引用数据类型
changeReference(strBuilder);
System.out.println(strBuilder.toString()); // 输出Hello World,strBuilder的内容改变了
// 再次传递引用数据类型
changeReferenceItself(strBuilder);
System.out.println(strBuilder.toString()); // 输出Hello World,strBuilder的内容没有改变
}
public static void changePrimitive(int num) {
num = 20;
}
public static void changeReference(StringBuilder strBuilder) {
strBuilder.append(" World");
}
public static void changeReferenceItself(StringBuilder strBuilder) {
strBuilder = new StringBuilder("New Object");
}
}
在这个例子中,changePrimitive
方法尝试改变基本数据类型的值,但原始的 num
变量不受影响。而 changeReference
方法改变了 strBuilder
引用指向对象的内容,所以原始的 strBuilder
也反映了这一变化。最后,changeReferenceItself
方法实际上改变了方法内部引用副本的指向,但原始的 strBuilder
引用仍然指向原来的对象,因此原始对象的内容没有改变。