天天看点

Java值传递方式详解:方法参数或参数的传递java里面的方法参数

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;
	}
}

           

执行结果:

Java值传递方式详解:方法参数或参数的传递java里面的方法参数

在这里我们可以看到,num的值并没有改变,这里面的执行过程可分为三步:

(1)n被初始化为num的一个拷贝——1

(2)n被修改为2,但是num任然是1,并没有改变

(3)方法接受后,n不再被使用(被自动回收)

所以,即时对n的值进行了操作让其改变,但是num的值因为没有对其做操作,所以num的值并没有改变

Java值传递方式详解:方法参数或参数的传递java里面的方法参数

在参数传递结束拷贝后,结构的草图相当于上图的中的第一个,而修改为 “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;
	}
}
           

执行结果:

Java值传递方式详解:方法参数或参数的传递java里面的方法参数

在这里我们看到,对象引用轻松的就对num进行了改变

在这里具体的执行过程也可分为三步:

(1) tt 被初始化为t值的拷贝,这里是一个对象的引用

(2)setNum的方法应用于这个对象的引用, tt 和 t 同时引用的那个Test对象的num被改变成了2

(3)方法结束,参数 tt 不再使用,被回收

Java值传递方式详解:方法参数或参数的传递java里面的方法参数

t 的指向是Test ,而 tt 是拷贝的 t ,也是指向的Test,在对 tt 进行修改时,setNum是修改其指向的地址的修改,即setNum之前,结构的草图如上图的第一个图,修改之后,是上图的第二个图,这样,就实现了对一个数据的修改

总结

实现一个改变对象参数状态的方法:只要方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象

在java中,或许有人会认为java的对象采用的是引用调用(虽然上文已说明,java全部都是按值传递),下面是一个推翻对象是引用调用的例子:

对变量执行交换方法,为什么值没有交换?

这个链接是我写的两个变量交换,值为什么没有改变的例子,可以充分的解释,为什么对象不是按值调用而是按值传递

java中方法参数的使用情况:

  • 一个方法不能修改一个基本类型的参数(数值型或布尔型)
  • 一个方法可以改变一个对象参数的状态
  • 一个方法不能让对象参数引用一个新的对象