Java中方法的形参传递机制----值传递机制

      调用Java中定义的方法,实参向形参传值时采用值传递机制,即形参变量存的是什么,就传什么。如果形参变量是基本类型的数据,那么就把实参变量的数据值传过去;如果形参变量是引用数据类型(eg:类、数组、接口等),那么这个实参变量里面存储的其实是这个引用类型对象的地址,那么就把实参变量中存储的地址值传给形参变量。下面简单区分一下形参和实参:

   形参: 方法在声明时,一对()内声明的变量

   实参:在方法调用时,实际传递给形参的值

下面通过一个例子来说明基本数据类型和引用数据类型的形参在参数传递过程中的区别:

形参为基本数据类型:

public class ValueTransferTest1 {
	public static void main(String[] args) {
		int m = 10;
		int n = 20;
		System.out.println("m = " + m + ", n = " + n);
		ValueTransferTest1 test = new ValueTransferTest1();
		test.swap(m,n);
		System.out.println("m = " + m + ", n = " + n);
	}
	public void swap(int m,int n){
		int temp = m;
		 m = n;
	     n = temp;
	} 
}

       上述代码段中函数swap( )的参数类型为基本数据类型,所以当调用函数test.swap(m,n)时,就会把实参变量m和n中的数据值10和20分别传递给形参变量m和n。注意这里的形参变量和实参变量虽然名字都相同,但他们之间没有任何的关系。容易看出形参变量m、n和实参变量m、n都为局部变量,且是分别定义的,所以他们两者分别存放在栈中不同的地方,互不影响。相当于是把实参变量的数据复制了一份交给了形参变量。而swap函数只是实现形参变量两个值的交换,并不会影响实参变量的值。运行结果如下图所示:

 下面给出运行过程中内存空间的状态变化:

        如图所示:程序从main()函数进入,main()函数中定义的变量为局部变量,存储在栈中,首先定义整型变量m并赋值为10,压在栈底,同理:定义局部变量n并赋值为20。当执行到swap函数时,进入定义的swap方法,先后声明形参变量m和n,同样为局部变量,在方法体中声明了整型变量temp,也是局部变量。方法体完成了对形参变量m和n的交换。出了函数swap后变量temp、形参n、形参m依次出栈,所以最终打印m和n的值还是之前的值。

形参为引用数据类型:

public class ValueTransferTest1 {
	public static void main(String[] args) {
     Data data = new Data();
     System.out.println("m = " + data.m + ", n = " + data.n);
     ValueTransferTest1 test = new ValueTransferTest1();
     test.swap(data);
     System.out.println("m = " + data.m + ", n = " + data.n);	
}
	 public void swap(Data data){
		 int temp = data.m;
		 data.m = data.n;
		 data.n = temp;
	 }
}
class Data{
	int m = 10;
	int n = 20;
}

        上述代码段中函数swap( )的参数类型为引用类型(类),所以当给Date类创建对象data时,就把new出来的对象实体的首地址赋给了data变量。而在调用函数swap( )时data做了实参,所以就把data里面存储的地址值传给了形参变量data,也就是说形参和实参现在指向的是堆中的同一片内存空间。在swap( )中完成的是对形参变量这个data对象里属性值m和n的值的交换,也就相当于对实参变量中的属性值做了交换(因为他们指向同一片内存区域)。

运行结果如下如所示,这一次的操作完成了交换。

  下面给出运行过程中内存空间的状态变化:

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值