方法中参数的传递问题是每一门语言的基础,java中的参数传递问题虽然很基础但是这又是很容易搞错的问题,网上对于此也是议论纷纷,最近阅读了csdn上很多关于java中方法参数是值传递还是引用传递的文章,我觉得讲得一般都不错,但是过于复杂,基于此,我发表一些我自己的看法。
对于方法参数为基本数据类型这个比较简单,没什么可说的,就是值传递,也就是说在方法内部随便操作参数的值,不会引起实际传递的值的改变。附上代码:
```java
public class example_2 {
public static void swap(int a, int b){
int tmp=a;
a=b;
b=tmp;
}
public static void main(String[] args) {
int a=3,b=2;
swap(a,b);
System.out.println(a+" "+b);
}
}
``
在本例中写了一个交换两个数的函数,调用这个方法后发现a,b的值并没有改变,这说明对于基本数据类型作为方法参数是只是复制了一下他们的值拷贝进去,所以方法内部的a和b和实际传进去的参数并没有关系
对于引用数据类型,有人说是值传递,有人说是引用传递,但是这两种说法都不能准确表达意思(至少对于初学者来说),我认为当方法参数为引用数据类型时是拷贝了一下实际参数所指向的地址,换句话说就是实际传进去的参数和在方法内部使用的参数的属性的地址是一样的,但是本身是不一样的,它只是实际参数的一个拷贝,所以这就造成了在方法内部修改参数的属性也就是修改了实际参数的属性。在此附上代码:
class Dog{
int id;
int age;
String name;
public int getId() {
return id;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
Dog(int id,int age,String name){
this.id=id;
this.age=age;
this.name=name;
}
public void Copy(Dog dog){
dog=this;
}
public void Copy2(Dog dog){
dog.id=id;
dog.age=age;
dog.name=name;
}
public String toString(){
return this.id+" "+this.age+" "+this.name;
}
public void foo(String s){
s=s+"123";
}
}
public class example {
public static void main(String[] args) {
Dog dog1=new Dog(1,2,"ton");
Dog dog2=new Dog(1,2,"TOm");
dog1.Copy(dog2);
System.out.println(dog2.toString());
dog1.Copy2(dog2);
System.out.println(dog2.toString());
dog2=dog1;
System.out.println(dog2.toString());
String s="456";
dog1.foo(s);
System.out.println(s);
}
}
程序输出为:
由此可以看出当dog1调用Copy方法如果方法内部的dog就是实际参数dog2,那么把this付给dog2后dog2的属性应该就是dog1的属性,但是输出结果确是dog2的属性并没有改变,所以方法内部的dog不等于dog2.
在观察发现当dog1调用Copy2方法对方法内部的dog改变属性后dog2的属性也改变了,这不难发现,dog和dog2指向的内容地址是一样的,但是本身是不一样的。
由上诉结果我们可知当方法的参数是基本数据类型时参数传递形式是值传递,当方法的参数是引用数据类型时,并也相当于值传递(因为实际参数和方法内内部的参数的属性地址完全一样,但是他们本身不一样,他们在内存里面并不是一个东西)