java传值传引用,我得说两句

来源:互联网 发布:ketchup 2017 for mac 编辑:程序博客网 时间:2024/06/05 20:13

关于java调用方法传值还是传引用,大部分说法都是基本类型传值,复杂类型传引用,其实Java方法调用只会传递值,该值是对于传入引用的一份copy
直接看代码说吧,先看基本类型代码:
public static void doPlus(int temp){temp=temp+1;}
int i=10; doPlus(i); jvm编译到这里时,doPlus方法形参里的temp是如何赋值的呢,是temp=i,
调用代码可以简单的理解为  
int i=10;
int temp=i;
temp=temp++;
你说执行完成后i的值会变么?
再看看复杂类型:
public static void setStudentName(Student stu){
stu.setName("学生A");
}
Student student=new Student();
setStudentName(student);
同样道理,这里可以简单理解为
Student student=new Student();
Student stu=student;
stu.setName("学生A");
这里执行完后student的name值就是"学生A"了,为什么呢,
Student student=new Student();这句大家都知道,就是在栈中创建一个student引用,堆中新建一块对象空间(这个空间里有name字段),student指向这块空间
执行完Student stu=student;这句后,stu这个引用就和上面的student引用都指向了堆中的同一块内存空间了,当stu对象执行setName方法后,这块空间里的name字段值就
被修改为"学生A了",student指向的也是这里,他的name值当然会对应变化。
好,我们接着还看复杂类型:
public static void setStudentName(Student stu){
//这里新增一句(请自动忽略设计问题......)
stu=new Student();
stu.setName("学生A");
}
调用方式还和上面一样,
Student student=new Student();
setStudentName(student);
执行完成后会发现student的name值没有变化,这又是为什么呢?
可以看到下面setStudentName方法新增了一句stu=new Student();  这句话大家都知道会把参数stu指向一个新建的堆空间,这块空间就有别于外面student指向的那个了
所以这时候无论stu怎么变化都不会再影响student的值了。
写到这里我想到网上有一类用String类型当做参数的问题,大意是这样的:

public static void changeString(String s){//改变String型变量的函数
                s="changeString";
}
调用代码:
String str="abc";
changeString(str);
完了之后当然str还是"abc",这是对的,但是好多解释竟然扯到String是不变类,所以这里怎么修改str还是不会变。
好吧,String类确实是final类型的,类中的char数组也是final类型的,但是这里也还是扯不到这个啊,
changeString方法里进去就把s又换了个对象去指向,当然怎么变也不会影响到str了,就这么简单
原创粉丝点击