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了,就这么简单
相关文章推荐
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
- 【Java垃圾回收机制与引用类型】
- Java:按值传递还是按引用传递详细解说
- Java中值传递和引用传递的区别
- java及C++中传值传递、引用传递和指针方式的理解
- JAVA8之方法引用
- java经典问题:传值还是传引用
- Java参数传值还是传引用
- 黑马程序员_Java多态性详解——父类引用子类对象
- java引用传递和值传递的详细探讨
- java中对对象的引用类型
- Java引用总结(强,软,弱,虚)
- Java基础知识---数组的引用传递
- java学习日记_46:引用类型作为返回值
- 理解 Java 的 GC 与 幽灵引用
- 关于java中的引用传递还是值传递的一点思考
- java值传递or引用传递解惑
- java传值还是传引用。
- JAVA中值类型和引用类型的不同?
- 理解 Java 的 GC 与 幽灵引用