我认为可以将所有的传递都看成是值传递。即拷贝实参的副本,将副本传递。 引用类型可以看作是一种常量指针。即引用本身的地址值不变(java中没有地址概念,这只是借c++来作个比方)。在参数传递的时候,将引用本身做一个拷贝,而改引用所指向的对象是不变的。 如: //MyTest.java public class MyTest { public int value; public static void main(String[] args) { MyTest test = new MyTest(); test.fun(); } public void fun() { MyTest t1 = new MyTest(); this.fun1(t1); System.out.println(t1.value); this.fun2(t1); System.out.println(t1.value); } public void fun1(MyTest t2) { t2.value = 2; } public void fun2(MyTest t3) { t3 = new MyTest(); t3.value = 5; } } 结果是 2 2 t1, t2, t3 都是引用,传参的时候t1被分别复制了一份传给了t2和t3.t1,t2,t3是三个不同的引用但他们都引用同一个对象(即,这三个指针本身不同,但却指向同一地址)。 t3 = new MyTest();后t3又指向新的对象,而对t1所指向的对象不再产生影响。
to:ilzzy(沧海微尘) 1.你说道都可以看成值传递,那能对我那个程序解释一下为什么对整个数组操作的时候会改变呢?2.你的程序中 this.fun1(t1);执行后由于fun1的定义使t1的值变为了2; public void fun2(MyTest t3) { t3 = new MyTest();//这个是不是多余呢?MyTest t3已经创建了啊 t3.value = 5; } 对于fun2,在对t1进行调用时,对t1有什么影响呢?到底发生了什么啊
引用类型可以看作是一种常量指针。即引用本身的地址值不变(java中没有地址概念,这只是借c++来作个比方)。在参数传递的时候,将引用本身做一个拷贝,而改引用所指向的对象是不变的。
如:
//MyTest.java
public class MyTest {
public int value;
public static void main(String[] args) {
MyTest test = new MyTest();
test.fun();
}
public void fun() {
MyTest t1 = new MyTest();
this.fun1(t1);
System.out.println(t1.value);
this.fun2(t1);
System.out.println(t1.value);
}
public void fun1(MyTest t2) {
t2.value = 2;
}
public void fun2(MyTest t3) {
t3 = new MyTest();
t3.value = 5;
}
}
结果是
2
2
t1, t2, t3 都是引用,传参的时候t1被分别复制了一份传给了t2和t3.t1,t2,t3是三个不同的引用但他们都引用同一个对象(即,这三个指针本身不同,但却指向同一地址)。
t3 = new MyTest();后t3又指向新的对象,而对t1所指向的对象不再产生影响。
1.你说道都可以看成值传递,那能对我那个程序解释一下为什么对整个数组操作的时候会改变呢?2.你的程序中
this.fun1(t1);执行后由于fun1的定义使t1的值变为了2; public void fun2(MyTest t3) {
t3 = new MyTest();//这个是不是多余呢?MyTest t3已经创建了啊
t3.value = 5;
}
对于fun2,在对t1进行调用时,对t1有什么影响呢?到底发生了什么啊