java里面的方法参数
在程序设计语言里面,有一些参数传递给方法的专业术语:按值调用;引用调用;以前还有的按名调用(Algol就是使用的这种)
其中java使用的就时按值调用:这种方法的特点是只得到所有参数的拷贝,方法不能修改传递给它的任意参数变量的内容
public class Main {
public static void main( String[] args)
{
int num = 1;
Main.change(num);
System.out.println("num = " + num);
}
public static void change(int n)
{
n = 2;
}
}
执行结果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL4gTMxEzMzYTMwEDNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
在这里我们可以看到,num的值并没有改变,这里面的执行过程可分为三步:
(1)n被初始化为num的一个拷贝——1
(2)n被修改为2,但是num任然是1,并没有改变
(3)方法接受后,n不再被使用(被自动回收)
所以,即时对n的值进行了操作让其改变,但是num的值因为没有对其做操作,所以num的值并没有改变
在参数传递结束拷贝后,结构的草图相当于上图的中的第一个,而修改为 “2” 后,相当于变成了第二个,让“n = 2;”,并不是对num的“1”进行的操作,而是将n的指向改变了,让其指向了“2”,而num指向的地址里面的“1”*没有改变,所以num还是“1”
其实,方法参数共有两种类型:
(1)基本数据类型(数字、布尔值)
(2)对象引用
上面已经看到了,我们无法对基本数据类型进行修改
但是对象引用就不一样了,我们可以轻松的对其进行修改
public class Main {
public static void main( String[] args)
{
Test t = new Test();
change(t);
System.out.println("t.getNum() = " + t.getNum());
}
public static void change(Test tt)
{
tt.setNum(2);
}
}
class Test{
private int num;
public Test()
{
num = 1;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
执行结果:
在这里我们看到,对象引用轻松的就对num进行了改变
在这里具体的执行过程也可分为三步:
(1) tt 被初始化为t值的拷贝,这里是一个对象的引用
(2)setNum的方法应用于这个对象的引用, tt 和 t 同时引用的那个Test对象的num被改变成了2
(3)方法结束,参数 tt 不再使用,被回收
t 的指向是Test ,而 tt 是拷贝的 t ,也是指向的Test,在对 tt 进行修改时,setNum是修改其指向的地址的修改,即setNum之前,结构的草图如上图的第一个图,修改之后,是上图的第二个图,这样,就实现了对一个数据的修改
总结
实现一个改变对象参数状态的方法:只要方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象
在java中,或许有人会认为java的对象采用的是引用调用(虽然上文已说明,java全部都是按值传递),下面是一个推翻对象是引用调用的例子:
对变量执行交换方法,为什么值没有交换?
这个链接是我写的两个变量交换,值为什么没有改变的例子,可以充分的解释,为什么对象不是按值调用而是按值传递
java中方法参数的使用情况:
- 一个方法不能修改一个基本类型的参数(数值型或布尔型)
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象