java的学习之路总是不平坦的,最近被java中函数参数的传递搞得有点糊涂了,所以经过查资料,现在总结一下自己的理解。下面这个例子不一定是那么有代表性,但是我个人觉得还是能说明一些问题。在这里的总结只是想让后面的人少走一些弯路,共同学习。
- 首先,看一行代码:Human man = new Human();相信学过C/C++的人可能会误以为man是一个对象,反正我一开始是这么觉得的,原来man只是一个对象的引用,对象的创建是用new Human()实现的。
- 然后,java中调用一个函数,参数间有一个拷贝动作(值的拷贝、对象引用的拷贝),本人刚看到是引用时,还以为和C++中的一样没有拷贝动作呢。
- 最后,关于概念上的传值、传引用,个人觉得不需要去纠结那么多,也可以全部理解成传值(这一点和C/C++里的理解是一样的地址也可以看作是值)。
下面看一个简单的例子:
package calculate;
class Test{
int val1;
int val2;
Test(int i1, int i2){
val1 = i1;
val2 = i2;
}
}
public class Demo {
Test test1;
Test test2;
public static void main(String[] args) {
Demo demo = new Demo();
demo.test1 = new Test(1, 2);
demo.test2 = new Test(3, 4);
int i1 = 5;
int i2 = 6;
System.out.println("初始值如下:");
System.out.println("demo.test1 = " + demo.test1.val1 + ", " + demo.test1.val2);
System.out.println("demo.test2 = " + demo.test2.val1 + ", " + demo.test2.val2);
System.out.println("i1 = " + i1);
System.out.println("i2 = " + i2);
System.out.println("测试如下:");
System.out.println("传值函数(1种情况)");
demo.fun1(i1, i2);
System.out.println("i1 = " + i1);
System.out.println("i2 = " + i2);
System.out.println("传引用函数(2种情况)");
System.out.println("1、交换两个对象引用");
demo.fun2(demo.test1, demo.test2);
System.out.println("demo.test1 = " + demo.test1.val1 + ", " + demo.test1.val2);
System.out.println("demo.test2 = " + demo.test2.val1 + ", " + demo.test2.val2);
System.out.println("1、修改对象引用的属性");
demo.fun3(demo.test1, demo.test2);
System.out.println("demo.test1 = " + demo.test1.val1 + ", " + demo.test1.val2);
System.out.println("demo.test2 = " + demo.test2.val1 + ", " + demo.test2.val2);
}
void fun1(int int1, int int2){
int1 = 4;
int2 = 3;
}
void fun2(Test t1, Test t2){
Test temp;
temp = t1;
t2 = t1;
t2 = temp;
}
void fun3(Test t1, Test t2){
t1.val1 = 0;
t1.val2 = 0;
t2.val1 = 0;
t2.val2 = 0;
}
}
结果如下所示:
这里说说本人的理解,第一个函数和C/C++中的差不多,是值的一份拷贝,所以对形参的修改并不能对实参进行改变;第二个函数,t1和t2分别是demo.test1和demo.test2的一份拷贝,此时它们分别和它们的拷贝指向同一个对象,但是对对象引用的修改(这里是修改了t1和t2指向的对象)并不会影响实参;第三个函数和第二个函数差不多,不过第三个函数内部是分别修改了t1和t2指向的对象属性,所以demo.test1和demo.test2也跟着一起修改了,因为它们都是指向同一个对象。