这个问题,网上一查越看越迷糊,纠结完了先总结下
先看个栗子:
1 public class Example {
2
3 public void change(String str1, StringBuffer sbr1, char[] ch1, int a) {
4 str1 = "world";
5 sbr1.append("world");
6 ch1[0] = ‘g‘;
7 }
8
9 public static void main(String args[]) {
10 String str = "hello";
11 StringBuffer sbr = new StringBuffer("hello");
12 char[] ch = { ‘a‘, ‘b‘ };
13 new Example().change(str, sbr, ch);
14 System.out.println(" str=" + str + "\n sbr=" + sbr + "\n ch[0]=" + ch[0]);
15 }
16 }
输出结果:
基本数据类型参数传递时按值这是没问题的,主要是对于引用数据类型传递的纠结
java参数传递不存在引用传递
//参考Horstmann在java核心技术卷一 p123的栗子
public static void swap(Employee x,Employee y){
Employee temp=x;
x=y;
y=temp;
}
main...{
Employee a=new Employee("jack");
Employee b=new Employee("rose");
swap(a,b);
}
这个例子看来,java肯定不是传引用了
来看下概念:
按值传递:方法接收的是原始值得副本
按引用传递:方法接收的是原始值的内存地址
java引用:java里面对于引用数据类型,stack里面会把一个可以指向heap里面目标对象的内存地址赋给一个变量,这个变量也叫引用
基本数据类型是传值这是肯定的,那么这个问题考虑完后就是这样的,对于引用数据类型
copy一个刚好叫做“引用”的东西传过去是叫他传引用还是传值呢 ? (传的方式、传的东西)
不要纠结了,能理解就好了 【当然形式上看还是传值,传了个引用的副本】
可以这样想,java参数传递相当于一个"="过程,它有3个特点
1."="对于基本数据类型是直接复制值,对于引用数据类型是复制的引用
2."="放弃原来的值、引用,重新获得左边的值、引用
3.复制完成左边右边就没关系了
总结:java参数传递等价于java里面的"="