程序设计语言中参数传递:1、值调用表示方法接收的是调用者的值。2、引用调用表示方法接收的是调用者提供的变量地址。
Java语言总是采用值调用。也就是说,函数得到的是参数值的一个拷贝,函数不能修改传递给它的任何参数变量的内容。请看下面的示例:
class Demo_20
{
public static void main(String [] arge)
{
int a = 2;
System.out.println(a);//未调用前输出
Double(a);//调用Double函数
System.out.println(a);//调用后输出
}
public static void Double(int b)
{
b = b * 2;
}
}
运行后结果为:2
2
首先看一下执行过程:
1、 b被初始化为a值的一个拷贝,
2、 b被乘以2后等于4,但a仍然是2,
3、 这个函数结束后,参数变量b不再被使用。
大家已经看到,一个方法不能修改一个基本数据类型的参数。但是对象应用就不同了,
请看示例:
class Change
{
private int a;
public Change(int a)
{
this.a=a;
}
public int getA()//返回a的值
{
return a;
}
public void Two(int b)//将a乘以b然后赋给a
{
a = a * b;
}
}
class Demo_21
{
public static void main(String [] arge)
{
Change e = new Change(4);//定义一个Change对象
System.out.println(e.getA());//输出
Turn(e);//调用Turn函数
System.out.println(e.getA());
}
public static void Turn(Change b)
{
b.Two(2);//将类里的变量a乘以2
}
}
运行结果为:4
8
具体执行过程为:
1、b初始化为e值的一个拷贝,这里是一个对象的引用。
2、Two函数应用到这个对象的引用。b和e同时引用那个Change对象的变量a被乘以了2.
3、函数结束后,参数变量不再使用。但是e仍然引用那个被改变的对象。
有些人会认为Java语言对对象的采用的是引用调用,其实这是不对的。
举例如下:
class Change
{
private int a;
public int getA()//返回a的值
{
return a;
}
public Change(int a)
{
this.a=a;
}
public void Two(int b)
{
a = a * b;
}
}
class Demo_10
{
public static void main(String [] arge)
{
Change a = new Change(4);
Change b =new Change(8);
System.out.println("a:"+a.getA()+",b:"+b.getA());//输出a和b
Swap(a,b);//调用Swap函数交换
System.out.println("a:"+a.getA()+",b:"+b.getA());//调用Swap函数后输出a和b
}
public static void Swap(Change e,Change f)
{
Change temp;
temp = e;
e = f;
f = temp;
}
}
运行结果:a:4,b:8
a:4,b:8
这个过程说明:Java语言对对象不是引用调用,实际上,对象引用进行的是值传递。
下面总结一下在Java程序设计语言中,函数参数的使用情况:
1、 一个函数不能修改一个基本数据类型的参数。
2、 一个函数可以改变一个对象参数的状态。
3、 一个函数不能实现让对象参数引用一个新的对象。