Java值传递小结
来源:互联网 发布:学唱简谱软件 编辑:程序博客网 时间:2024/06/16 17:30
方法在传递参数时都是采用值传递,不过对于基本数据类型传递的是数据的字面值,如(int a = 2;)此处传递的值为2;对于对象引用,传递则是引用地址指向。具体示例见如下代码:
public class Mill {double num = 55.5D;String str = new String("good");char[] ch = {'a','b','c'};boolean flag = true;float f = 35.5f;public static void main(String[] args) {Mill ex = new Mill();change(ex.str, ex.ch, ex, ex.f);System.out.println(ex.string);System.out.println(ex.ch);System.out.println(ex.num);System.out.println(ex.flag);System.out.println(ex.f);}public static void change(String str,char[] ch,Mill mill,float f ) {mill.num = 10.1D;str = "test ok";ch[0] = 'g';mill = new Mill();f = 44.5f;mill.flag = false;}}
【输出结果】:
good
gbc
10.1
true
35.5
结合以上案例进行实际分析:
上面
change(String str,char[] ch,Mill mill,float f )方法中String类型比较特殊,放在最后说。
char[] 字符数组和Mill为引用对象,float为基本类型。
mill.num = 10.1D;
通过上图,可以看出ex对象在进入change方法时,将自己的引用地址传递给了mill变量,所以此时两者指向的是同一个对象,所以在mill.num = 10.1D处改变了引用对象的成员属性num,所以在输出时候,ex.num的值也改变了。char[]数组ch虽然是mill的一个成员属性,但它也是引用地址传递,所以也是如此,不再解释。
f = 44.5f;
由于ex.f是float类型的,在经过方法时,传递的是它的字面值,此时,在栈内存中开辟了一块新的区域用来存放float变量f,所以在方法中操作f对ex.f的值没有任何影响,而在方法结束时,f的作用域结束,在随后一段时间内,会被jvm的垃圾回收器回收。
mill = new Mill();mill.flag = false;
当mill进入change方法时,和ex指向的是同一个对象实例1,运行mill = new Mill();后,产生一个新的对象实例2,mill 此时指向实例2,然后mill.flag = false;改变的是实例2的属性,与实例1无关。
str = "test ok";String虽然也是引用类型,但它比较特殊,这还涉及到String的字符串池,此处进行简单解释:
String类在内存中单独管理一个字符串池,它的创建机制是这样的:当创建一个新的字符串的时候,它会先从字符串池中查找是否有这个字符串,如果存在就讲声明变量指向这个字符串所在的地址,没有才去新建一个字符串维护在变量池中,字符串池中的字符串不会被修改。
开始时候,str 指向“good”字符串,进入change方法后,拷贝一个新的引用地址给change中str变量,然后运行str = “test ok”,他会发现没有这个字符串,然后就去新建了一个字符串“test ok”,此时,change中str变量指向“test ok”(此处改变了引用地址,而不是改变原有地址对应的内容),原有的地址依然是字符串“good”,所以在main中的ex.str指向的地址处内容并没有改变,还是“good”。
- Java值传递小结
- Java参数传递小结
- java值传递,引用传递,数组传递
- java 值传递 引用传递
- Java 值传递 引用传递
- Java 值传递 引用传递
- Java 值传递 引用传递
- Java引用传递&值传递
- java值传递,引用传递
- java值传递,引用传递
- java值传递、引用传递
- java 值传递 数组传递
- Java参数传递,值传递
- java往oracle存储过程中传递数组方法小结
- JAVA前端与后端参数传递方法小结
- webview中java代码与js信息传递小结
- java往oracle存储过程中传递数组方法小结
- Java Web中前台与后台传递参数小结
- Http中Cookie详解以及Android中操作Cookie
- Alerter华丽的消息推送栏
- 全面的IE兼容性调试问题
- 水平滚动导航菜单
- VSFTPD设置匿名登陆
- Java值传递小结
- jquery.countdown 倒计时插件的学习
- 有限状态机基础知识记录
- Hive中的函数
- NOIP 2013 Senior 5
- MFC计算器项目——普通计算模块
- springmvc(5)--springmvc和mybatis整合实现商品查询
- Android设备上一张图片的显示过程
- 斐波那契研究1