java方法参数传递问题,有争论传值、传引用的,写几行实际看看就行了。
- package nba;
- import java.util.ArrayList;
- import java.util.List;
- public class TestParam {
- private static void change(int i) {
- // 不会影响到函数之外
- i = 100;
- }
- private static void change(String s) {
- // 不会影响到函数之外
- s = "the String has been changed.";
- }
- private static void change(String[] array) {
- // 取消注释后,对array的操作不会影响到函数之外
- // array = new String[2];
- for(int i=0;i<array.length;i++)
- array[i] = i + " changed";
- }
- private static void change(List<Object> list) {
- // 取消注释后,对list的操作不会影响到函数之外
- // list = new ArrayList<Object>();
- list.add("AA");
- list.add("BB");
- }
- //==============print functions region========================
- private static void print(String prefix) {
- System.out.println(prefix);
- }
- private static void print(String prefix, int i) {
- print(prefix);
- System.out.println("i=" + i);
- }
- private static void print(String prefix, String s) {
- print(prefix);
- System.out.println("s=" + s);
- }
- private static void print(String prefix, List<Object> list) {
- print(prefix);
- if (list == null) {
- System.out.println("list is null.");
- return;
- }
- System.out.println("list.size()=" + list.size());
- String s = "";
- for (int i = 0; i < list.size(); i++) {
- s += list.get(i);
- if (i < list.size() - 1)
- s += ";";
- }
- System.out.println("list=" + s);
- }
- private static void print(String prefix, Object[] array) {
- print(prefix);
- if (array == null) {
- System.out.println("array is null.");
- return;
- }
- System.out.println("array.length=" + array.length);
- String s = "";
- for (int i = 0; i < array.length; i++) {
- s += array[i];
- if (i < array.length - 1)
- s += ";";
- }
- System.out.println("array=" + s);
- }
- //==============print functions region end========================
- public static void main(String[] args) {
- String before = "======before change====";
- String after = "======after change======";
- String[] array = new String[3];
- print(before, array);
- change(array);
- print(after, array);
- List<Object> list = new ArrayList<Object>();
- print(before, list);
- change(list);
- print(after, list);
- String s = "this is a String";
- print(before, s);
- change(s);
- print(after, s);
- int i = 0;
- print(before, i);
- change(i);
- print(after, i);
- }
- }
======before change====
array.length=3
array=null;null;null
======after change======
array.length=3
array=0 changed;1 changed;2 changed
======before change====
list.size()=0
list=
======after change======
list.size()=2
list=AA;BB
======before change====
s=this is a String
======after change======
s=this is a String
======before change====
i=0
======after change======
i=0
array.length=3
array=null;null;null
======after change======
array.length=3
array=0 changed;1 changed;2 changed
======before change====
list.size()=0
list=
======after change======
list.size()=2
list=AA;BB
======before change====
s=this is a String
======after change======
s=this is a String
======before change====
i=0
======after change======
i=0
取消两个注释行后
- private static void change(String[] array) {
- // 取消注释后,对array的操作不会影响到函数之外
- array = new String[2];
- for(int i=0;i<array.length;i++)
- array[i] = i + " changed";
- }
- private static void change(List<Object> list) {
- // 取消注释后,对list的操作不会影响到函数之外
- list = new ArrayList<Object>();
- list.add("AA");
- list.add("BB");
- }
======before change====
array.length=3
array=null;null;null
======after change======
array.length=3
array=null;null;null
======before change====
list.size()=0
list=
======after change======
list.size()=0
list=
java方法参数传递小结:
基础数据类型(int,char,……)传值,对象类型(Object,数组,容器……)传引用。
有说java方法参数都是传值的,理解方式不同而已。引用本身也是值(对象地址)。
传值方式,传递的是值的副本。方法中对副本的修改,不会影响到调用方。
传引用方式,传递的是引用的副本。此时,形参和实参指向同一个内存地址。对引用副本所指向的对象的修改,如修改对象属性、容器内容等,会影响到调用方。对引用副本本身(对象地址)的修改,如设置为null,重新指向其他对象,不会影响到调用方。
只要知道传引用时,也是传递的引用的副本,就比较容易理解了。