在java语言中,成员方法中可以有多个不同数据类型的参数,也可以一个没有。对于参数我们需要区分形式参数和实际参数的概念。形式参数是指定义成员方法时,括号里面的参数名字。实际参数是指在程序代码中调用成员方法时,传递给方法的参数。
1 基本数据类型形式参数的值传递
示例如下:
public class Demo1 {
public static void main(String[] args) {
int a=4,b=5;
System.out.println("运算前实参:a="+a+" "+"b="+b);
Test c=new Test();
c.test(a, b);
System.out.println("运算后实参:a="+a+" "+"b="+b);
}
}
class Test
{
public void test(int x,int y)
{
System.out.println("运算前形参:x="+x+" "+"y="+y);
x=x-1;//改变形参x的值
y=y+1;//改变形参y的值
System.out.println("运算后形参:x="+x+" "+"y="+y);
}
}
运算结果:
运算前实参:a=4 b=5
运算前形参:x=4 y=5
运算后形参:x=3 y=6
运算后实参:a=4 b=5
从结果看出,两个实际参数在运算前后都没有发生变化,而形式参数的值则发生了改变,说明基本类型参数是单向值传递。
2 引用类型形式参数的引用传递
程序中经常需要把一个对象作为实际参数进行传递,这和基本类型数据的值传递情况不同,因为此时传递的是对象的引用(地址)。当实参对象的引用(地址)被复制给形参时,对形参对象内容进行改变也就是对实参对象内容进行改变。
示例如下:
public class Demo2 {
public static void main(String[] args) {
Test a=new Test();
int b=3;
System.out.println("运算前实参:a.v="+a.v+" "+"b="+b);
Test1 c=new Test1();
c.test1(a, b);
System.out.println("运算后实参:a.v="+a.v+" "+"b="+b);
}
}
class Test
{
int v=0;
}
class Test1
{
public void test1(Test x,int y)
{
x.v=2;
y=4;
}
}
运算结果:
运算前实参:a.v=0 b=3
运算后实参:a.v=2 b=3
从结果可以看出,当把对象作为方法的参数时,由于它传递的是对象的引用(地址),因此形式参数对象内容的改变会影响到实际参数,而基本类型没有影响。