java方法参数传递

 java方法参数传递问题,有争论传值、传引用的,写几行实际看看就行了。

  1. package nba;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class TestParam {
  5.     private static void change(int i) {
  6.         // 不会影响到函数之外
  7.         i = 100;
  8.     }
  9.     private static void change(String s) {
  10.         // 不会影响到函数之外
  11.         s = "the String has been changed.";
  12.     }
  13.     private static void change(String[] array) {
  14.         // 取消注释后,对array的操作不会影响到函数之外
  15.         // array = new String[2];
  16.         for(int i=0;i<array.length;i++)
  17.             array[i] = i + " changed";
  18.     }
  19.     private static void change(List<Object> list) {
  20.         // 取消注释后,对list的操作不会影响到函数之外
  21.         // list = new ArrayList<Object>();
  22.         list.add("AA");
  23.         list.add("BB");
  24.     }
  25.     //==============print functions region========================
  26.     private static void print(String prefix) {
  27.         System.out.println(prefix);
  28.     }
  29.     private static void print(String prefix, int i) {
  30.         print(prefix);
  31.         System.out.println("i=" + i);
  32.     }
  33.     private static void print(String prefix, String s) {
  34.         print(prefix);
  35.         System.out.println("s=" + s);
  36.     }
  37.     private static void print(String prefix, List<Object> list) {
  38.         print(prefix);
  39.         if (list == null) {
  40.             System.out.println("list is null.");
  41.             return;
  42.         }
  43.         System.out.println("list.size()=" + list.size());
  44.         String s = "";
  45.         for (int i = 0; i < list.size(); i++) {
  46.             s += list.get(i);
  47.             if (i < list.size() - 1)
  48.                 s += ";";
  49.         }
  50.         System.out.println("list=" + s);
  51.     }
  52.     private static void print(String prefix, Object[] array) {
  53.         print(prefix);
  54.         if (array == null) {
  55.             System.out.println("array is null.");
  56.             return;
  57.         }
  58.         System.out.println("array.length=" + array.length);
  59.         String s = "";
  60.         for (int i = 0; i < array.length; i++) {
  61.             s += array[i];
  62.             if (i < array.length - 1)
  63.                 s += ";";
  64.         }
  65.         System.out.println("array=" + s);
  66.     }
  67.     //==============print functions region end========================
  68.     
  69.     public static void main(String[] args) {
  70.         String before = "======before change====";
  71.         String after = "======after change======";
  72.         String[] array = new String[3];
  73.         print(before, array);
  74.         change(array);
  75.         print(after, array);
  76.         List<Object> list = new ArrayList<Object>();
  77.         print(before, list);
  78.         change(list);
  79.         print(after, list);
  80.         String s = "this is a String";
  81.         print(before, s);
  82.         change(s);
  83.         print(after, s);
  84.         int i = 0;
  85.         print(before, i);
  86.         change(i);
  87.         print(after, i);
  88.     }
  89. }
输出:
======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
 
取消两个注释行后
 
 
  1. private static void change(String[] array) {
  2.         // 取消注释后,对array的操作不会影响到函数之外
  3.         array = new String[2];
  4.         for(int i=0;i<array.length;i++)
  5.             array[i] = i + " changed";
  6.     }
  7.     private static void change(List<Object> list) {
  8.         // 取消注释后,对list的操作不会影响到函数之外
  9.         list = new ArrayList<Object>();
  10.         list.add("AA");
  11.         list.add("BB");
  12.     }
输出:

======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,重新指向其他对象,不会影响到调用方。

只要知道传引用时,也是传递的引用的副本,就比较容易理解了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值