网络品牌公关网站推广和优化系统
在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
引用仍然指向原来的对象,因此原始对象的内容没有改变。