Java方法参数
在程序设计语言中如何将参数传给方法(或函数):
- 按值调用:方法接受的是调用者提供的值
- 按引用调用:方法接受的是调用者提供的地址
Java程序设计语言总是采用按值调用(方法得到的是所有参数值的一个副本)
public static void main(String [] args)
{
int x1=6;
add(x1);
System.out.println(x1);
}
public static void add(int x)
{
x=x+x;
}
调用add()方法后,x1值还是6,并没有改变,具体流程:
- x初始化为x1值的一个副本
- x加上自己后为12,但是x1的并没有改变
- 方法结束后,参数变量x不再使用
如果传入的是对象引用,很容易改变x1的值
int x1=6;
public static void main(String [] args)
{
Test test=new Test();
test.add(test);
System.out.println(test.x1);
}
public void add(Test x)
{
x.x1=x.x1+x.x1;
}
具体步骤是:
- x初始化test对象变量的一个副本,两个对象变量都指向同一类
- add()利用x参数变量,调用x1参数完成操作
- 方法结束后,x不在使用,对象变量test继续引用那个对象
但是Java并不是按引用调用
int x1;
public static void main(String [] args)
{
Test test=new Test(0);
Test test1=new Test(1);
test.swap(test,test1);
System.out.println(test.x1);
System.out.println(test1.x1);
}
public Test( int x1)
{
this.x1=x1;
}
public void swap(Test x,Test y)
{
Test temp=x;
x=y;
y=x;
}
我们发现输出还是0,1,对象并没有发生交换,因为x,y分别是对象变量test,test1的副本,方法执行时只完成x,y副本的交换,方法执行结束后,x,y变量不再使用,test,test1还是指向对象并没有改变。
Java对象引用其实是按值传递。
总结:
- 方法不能修改基本数据类型的参数(即数值型或布尔型)
- 方法可以改变对象参数的状态
- 方法不能让一个对象参数引用一个新的对象
在c++中可以用&实现按引用调用,&符号相当于取地址的意思。例void swap(Test &x,Test&y)