本人拙见,大家共同学习,有问题还望指正
java中值传递,我的理解:
对于对象,则传递对象引用地址,所有在此地址上的修改,凡是指向改地址的引用都会发生改变,即改变了传递的参数。
对于基本类型和不可变对象例如String,本身是不可变的,无法对其进行直接修改,所以不会改变传递的参数
简单的代码说明
<pre name="code" class="java">public class Test{
public static void main(String[] args){
Test test = new Test();
// 声明并初始化两个对象,用于测试
MyObject myObject1 = new MyObject();
myObject1.set(1,"I'm myObject1!");
MyObject myObject2 = new MyObject();
myObject2.set(2,"I'm myObject2!");
System.out.println("初始对象值为:");
System.out.println("myObject1 : " + myObject1.toString());
System.out.println("myObject2 : " + myObject2.toString());
System.out.println();
// 交换对象值,查看结果
test.swapObject(myObject1,myObject2);
System.out.println("交换后对象值为:");
System.out.println("myObject1 : " + myObject1.toString());
System.out.println("myObject2 : " + myObject2.toString());
System.out.println();
// 改变对象值,查看结果
test.changeObject(myObject1);
System.out.println("改变后对象值为:");
System.out.println("myObject1 : " + myObject1.toString());
System.out.println();
int a = 1;
int b = 2;
System.out.println("初始值为:");
System.out.println("a : " + a);
System.out.println("b : " + b);
System.out.println();
// 交换
test.swapInt(a, b);
System.out.println("交换后值为:");
System.out.println("a : " + a);
System.out.println("b : " + b);
System.out.println();
test.changeInt(a);
System.out.println("交换后值为:");
System.out.println("a : " + a);
}
public void swapObject(MyObject myObject1, MyObject myObject2){
MyObject temp = myObject1;
myObject1 = myObject2;
myObject2 = temp;
}
public void changeObject(MyObject myObject){
myObject.id = 1000;
myObject.decription = "I'm changed!";
}
public void swapInt(int a, int b){
int temp = a;
a = b;
b = temp;
}
public void changeInt(int a){
a = 1000;
}
}
// 简单对象
class MyObject{
public int id;
public String decription;
public void set(int id, String decription){
this.id = id;
this.decription = decription;
}
// 重写toString方法,打印类的所有属性
@Override
public String toString(){
return "MyObject [id=" + id + ", decription=" + decription + "]";
}
}
执行结果为
初始对象值为:
myObject1 : MyObject [id=1, decription=I'm myObject1!]
myObject2 : MyObject [id=2, decription=I'm myObject2!]
交换后对象值为:
myObject1 : MyObject [id=1, decription=I'm myObject1!]
myObject2 : MyObject [id=2, decription=I'm myObject2!]
改变后对象值为:
myObject1 : MyObject [id=1000, decription=I'm changed!]
初始值为:
a : 1
b : 2
交换后值为:
a : 1
b : 2
交换后值为:
a : 1
在对象交换中,没有对本身的值进行改变,并且在方法中只是在对B的指向地址做了改变,跟A没有多大关系
在对象改变中,B直接对A传递的内容进行了更改,这里是直接把myObject1的属性做了修改
在基本类型中,两种都没有直接对内容的改变,从始至终1还是1,没有改变,而且a始终指向的是1