Java参数传递
来源:互联网 发布:json文件dw打开乱码 编辑:程序博客网 时间:2024/06/05 23:04
转自: java中的值传递和引用传递
一、值传递和引用传递
- 值传递
传递的是原始值的副本,即原始值的拷贝。因此如果函数内修改了该参数,则仅仅是修改了副本,而原始值保持不变。 - 引用传递
函数接收的是原始值的内存地址。 - 结论:Java是按值传递参数,传递的都是一份拷贝,而不是数据本身。
二、代码验证
1、 基本数据类型按值传递参数代码验证:
package com.tide.controller;/** * Created by wengliemiao on 16/3/28. */public class Example1 { public static void main(String[] args) { Example1 e = new Example1(); int a = 2; int b = 5; e.change(a, b); System.out.println("结果为: " + a + " " + b); } public void change(int a, int b) { int i = a; a = b; b = i; }}
说明:由于传递的是 a 和 b 的拷贝,因此 change() 函数内的值交换对原始值未造成影响,因此输出还是 2 和 5.
2、引用数据类型按值传递代码验证:
引用数据类型参数说明:传递的是对象的引用的拷贝,因此修改对象的内容会对对象造成影响;而修改引用的地址,如修改指向的对象,则不会对对象造成影响,只是引用的拷贝指向了一个新的对象。
2.1、参数为引用数据类型情况一:
传递的是对象的引用的拷贝。
代码验证如下:
package com.tide;/** * Created by wengliemiao on 16/3/28. */public class Example2 { int i = 0; public static void main(String[] args) { Example2 a = new Example2(); a.add(a); System.out.println(a.i); } public void add(Example2 a2) { a2.i ++; }}
说明:更改了对象的 i 属性,由于 a2 和 a 指向的是同一个对象,所以修改 a2 对象的属性,也即修改 a 对象的属性。
2.2 参数为引用数据类型情况二,在方法中修改了引用的指向,则对修改指向后的对象的值的更改对原始对象无影响。
代码验证:
package com.tide;/** * Created by wengliemiao on 16/3/28. */public class Example2 { int i = 0; public static void main(String[] args) { Example2 a = new Example2(); a.add(a); System.out.println(a.i); } public void add(Example2 a2) { a2 = new Example2(); // 增加此行代码 a2.i ++; }}
说明:修改了 a2 引用的指向,则对 i 属性的更改不会对 a 对象造成影响。
3.参数为引用数据类型的特殊情况:String 类:
package com.tide.controller;/** * Created by wengliemiao on 16/3/28. */public class Example3 { private String str = "Hello"; private char[] ch = {'a', 'b', 'c'}; public void change(String s, char[] aCh) { s = "good"; aCh[0] = 'g'; } public static void main(String[] args) { Example3 a = new Example3(); a.change(a.str, a.ch); System.out.println(a.str); System.out.println(a.ch); }}
说明:其实String也是对象类型,按值传递参数类型,但因为String对象只要一改变就会产生新的对象,所以此处相当于:
s = new String("good");
因此,修改String值的操作都相当于修改了引用的指向地址。
三、总结
Java中的按值传递参数可分为两种:
1、传递值的数据类型:八中基本数据类型和String;
2、传递地址值的数据类型:除String以外的复合数据类型,包括数组,类和接口。
最后记录一个例子:
package com.tide;/** * Created by wengliemiao on 16/3/28. */public class Example4 { private int a = 10; private StringBuffer sb1 = new StringBuffer("This is sb1 "); private StringBuffer sb2 = new StringBuffer("This is sb2 "); public void modify(int a, StringBuffer sb1, StringBuffer sb2) { a = 0; sb1 = new StringBuffer("This is sb3"); sb2.append(", add append."); } public static void main(String[] args) { Example4 a = new Example4(); System.out.println("before modify: "); System.out.println(a.a); System.out.println(a.sb1); System.out.println(a.sb2); a.modify(a.a, a.sb1, a.sb2); System.out.println(); System.out.println("after modify: "); System.out.println(a.a); System.out.println(a.sb1); System.out.println(a.sb2); }}
输出为:
0 0
- Java参数传递,值传递
- Java参数传递
- Java参数传递
- java的参数传递
- java中的参数传递
- java中的参数传递
- JAVA的参数传递
- Java参数传递方式
- java参数传递
- Java-参数的传递
- java方法参数传递
- Java中的参数传递
- Java 参数传递机制
- java参数传递
- Java参数传递(推荐)
- java中的参数传递
- java参数传递
- Java的参数传递
- 51nod-1003 阶乘后面0的数量
- 利用任务调度特性检测Android模拟器
- Python Built-in Exception
- SpringMVC源码分析系列
- 用户栈&内核栈
- Java参数传递
- centos linux 编译安装pcre软件
- 基数排序
- android studio 获取sha1 和 md5 的值
- 46. Permutations
- nio-Buffer
- 动态代理模式
- 初涉RxAndroid .from() .just() 以及线程操作
- 初学processing(一)