形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。 1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能 再使用该形参变量。 2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值, 输入等办法使实参获得确定值。 3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。 4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变, 而实参中的值不会变化。 参看如下一段代码和它的运行效果:
<pre name="code" class="java">import java.util.ArrayList; public class Test{ public Test(){ int tempParam=1; Integer tempObj=1; increseParam(tempParam); increseObj(tempObj); System.out.println("result_1=:"+tempParam); System.out.println("result_2=:"+tempObj); tempParam=increseParam(tempParam); tempObj=increseObj(tempObj); System.out.println("result_3=:"+tempParam); System.out.println("result_4=:"+tempObj); String tempString="TEST"; anaString(tempString); System.out.println("result_5=:"+tempString); tempString=anaString(tempString); System.out.println("result_6=:"+tempString); ArrayList<String> list=new ArrayList<String>(); list.add("AAAAA"); list.add("BBBBB"); list.add("CCCCC"); System.out.println("size1=:"+list.size()); clearList(list); System.out.println("size3=:"+list.size()); ArrayList<String> list2=new ArrayList<String>(); list2.add("AAAAA"); list2.add("BBBBB"); list2.add("CCCCC"); System.out.println("sizeA=:"+list2.size()); newList(list2); System.out.println("sizeC=:"+list2.size()); } public int increseParam(int i){ i++; return i; } public int increseObj(Integer i){ i++; return i; } public String anaString(String str){ str=str+"_APPEND"; return str; } public void clearList(ArrayList<String> list){ list.clear(); System.out.println("size2=:"+list.size()); } public void newList(ArrayList<String> list){ list=new ArrayList<String>(); list.add("DDDDD"); System.out.println("sizeB=:"+list.size()); } public static void main(String[] args){ new Test(); } }
运行效果:
从这个例子中可以看出,可以在方法内部通过方法参数列表中传递过来的对象的引用(形参)来控制对象(通过对象对应的类中的方法),但是不能重建这个引用原来所对应的对象(实参),在方法中对引用所做的重建只是在方法内部起作用。