Java总是采用按值调用

参数传递给方法的有两种形式:

  • 按值调用(call by value):表示方法接收的是调用者提供的值。
  • 按引用调用(call by reference):表示方法接收的是调用者提供的变量地址。

Java总是采用按值调用。也就是说方法得到的是所有参数值的一个副本。具体来将,方法不能修改传递给它的任何参数变量的内容。

有两种类型的方法参数:

  • 基本数据类型(数字、布尔值)。
  • 对象引用。

当方法参数为基本数据类型的情况:
假定一个方法试图将一个参数值增加至3倍:

public static void tripleValue() {
	x = 3 * x;
}

然后调用这个方法:

double percent = 10;
tripleValue(percent);

percent的值在调用前后没有变化。

执行过程:

  1. x初始化为percent值的一个副本(也就是10)。
  2. x乘以3后等于30,但是percent仍然是10。
  3. 这个方法结束之后,参数变量x不再使用。

当方法参数为对象引用的情况:
很多人认为Java对对象采用的是按引用调用,实际上,这是不对的。

首先编写一个交换两个Employee对象的方法:

public static void swap(Employee x, Employee y) {
	Employee tmp = x;
	x = y;
	y = tmp;
}

如果Java对对象采用的是按引用调用,那么这个方法就应该能够实现交换:

	var a = new Employee();
	var b = new Employee();
	swap(a,b);

但是,这个方法并没有改变存储在变量a和b中的对象引用。swap方法的参数x和y被初始化为两个对象引用的副本,这个方法交换的是这两个副本。在方法结束时参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象。

这个过程说明:Java中对象引用是按值传递的

总结在Java中对方法参数能做什么和不能做什么:

  • 方法不能修改基本数据类型的参数(即数值型或布尔型)。
  • 方法可以改变对象参数的状态。
  • 方法不能让一个对象参数引用一个新的对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值