Java方法的参数传递

Java中方法的参数传递只有一种方式:值传递

将实际参数值的副本(复制品)传入方法中,而参数本身不受影响。所谓形参就是方法声明定义的时候的参数,实参就是方法调用时实际传递给形参的参数。介绍之前先简单了解下Java内存模型

 那对于常见的一个学习的类就是Person,关于以下初始化如何实现的呢?

//对象声明
Person p = new Person();

//变量定义
int i = 1;

栈中存放的对象的地址,真正的对象存在堆中,这就是引用对象

1.基本数据类型方法参数传递

接着看一下方法的参数传递

public class TestTransfer {
    public static void swap(int i) {
		i = 6;
		System.out.println("swap方法里面的i的值: "+i);
	}
    public static void main(String[] args) {
		int a = 0;
		swap(a);
		System.out.println("main方法里面的a的值: "+a);
	}
}
//输出结果
swap方法里面的i的值: 6
main方法里面的a的值: 0

这个很容易理解,因为在栈内存先创建一个变量a并分配地址,调用swap(int i) ,再次在栈中开辟一个新的内存,其存放的值就是a传过来的值,就是0,执行i = 6的时候,将i在栈中的值就修改为6

因此:基本数据类型参数传递就是把实参的值复制到形参上

2.引用对象类型方法参数传递

class DataSwap{
	public int a;
}

public class TestTransfer {
    public static void swap(DataSwap ds1) {
		ds1.a = 6;
		System.out.println("swap方法里面的i的值: "+ds1.a);
	}
    public static void main(String[] args) {
		DataSwap ds = new DataSwap();
		System.out.println("执行swap方法前的a的值: "+ds.a);
		swap(ds);
		System.out.println("执行swap方法后的a的值: "+ds.a);
	}
}
//输出结果
执行swap方法前的a的值: 0
swap方法里面的i的值: 6
执行swap方法后的a的值: 6

当调用DataSwap的时候,因此其属性a没有进行初始化,因此默认值为0。当调用swap(Object obj)之后

其过程如下:

  1. DataSwap ds = new DataSwap(),把new DataSwap()存放到了堆内存中,分配的内存地址地址是BEP2500
  2. ds引用对象存放在栈中,其内存地址AG5300,值是new DataSwap()对象在堆内存中的地址BE2500
  3. 调用swap方法后,给ds1引用对象保存到栈中,地址是AG6300,存放的值是来源于于实参(ds),也就是ds在栈中存放的值,这个就是new DataSwap()对象在堆内存中的地址,因此无论是ds还是ds1都是执行了同一个对象,这个对象就是在堆内存中地址是BE2500上保存的对象

所以关于方法中参数传递,有如下结论:

  • 如果形参是基本数据类型,那么实参(实际数据)向形参传递的时候,就是直接传递值,把实际值复制给形参
  • 如果形参是对象,那么实参(实际对象),向形参传递参数时,也是把值传递给形参,这个值是实参在栈的值,也就是引用对象在堆内存中的地址,

从上面的实践中可知, 基本数据类型都是保存栈中,引用对象在栈内存中保存的是引用对象的地址,那么方法参数传递是传递值(变量在栈内存中的值)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值