您的位置:首页 > 编程语言 > Java开发

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

2017-11-27 13:19 453 查看

关于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了,就这么简单
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息