Java中的参数传递到底是引用传递还是值传递

1.前言

错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是值,那么就是值传递;如果是引用,那么就是引用传递
错误理解二:Java是引用传递
错误理解三:传递的参数如果是普通类型,那么就是值传递;如果是对象那么就是引用传递

以上说法其实都不是很正确.

2.实参与形参

参数在程序语言中分为形式参数和实际参数
形式参数:在定义函数名和函数体时使用的参数,目的是在接收调用该函数时传入的参数
实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为"实际参数"

public class Main {
	public static void main(String[] args) {
		Main main = new Main();
		// 实际参数为CoffeeBaby
		main.printParam("CoffeeBaby");
	}
	public void printParam(String name) {
		// 形式参数为name
		System.out.println(name);
	}
}

实际参数是调用有参方法时真正传递的内容,而形式参数时用于接收实际参数内容的参数

3.求值策略

当调用方法时,需要把实际参数传递给形式参数,在传递的过程中相信大家在日常开发过程中会感到疑惑,到底传递的是什么?
这个问题其实并不只是Java中会存在,而是在程序设计当中普遍存在的问题,这其实是求值策略的概念
在计算机科学中,求职策略是确定变成语言中表达式的求值的一组规则。求值策略定义了何时、以何种顺序传值给函数的实际参数,以及什么时候把它们代换入函数,代换以何种形式发生

按照如何处理传递给函数的实际参数,求值策略分为严格求值和非严格求值两种

3.1 严格求值

在函数调用过程中,传递给函数的实际参数总是在应用给这个函数之前求值,目前大多数编程语言中对函数都使用了严格求值
在严格求值中有几个关键的求值策略是我们比较关心的,那就是传值调用(Call by Value)‘、传引用调用(Call by Reference) 以及传共享对象调用(Call by Sharing)

3.1.1 传值调用(值传递)

在传值调用中,实际参数先被求值,然后其值通过复制,被传递给被调函数的形式参数,因为形式参数获取的只是一个“局部拷贝”,所以如果在被调用函数中改变了形式参数的值,则并不会改变实际参数的值

3.2 传引用调用(引用传递)

在传递引用调用中,传递给函数的是它的实际参数的隐式引用而不是实参的副本。因为传递的是引用,所以如果在被调函数中改变了形式参数的值,改变对于调用者来说是可见的,也就是说会改变实际参数的值

3.3 传共享对象调用(共享对象传递)

传共享对象调用中,先获取实际参数的地址,然后将其复制,并把该地址的副本传递给被调函数的形式参数。因为参数的地址都指向了同一个对象,所以也称“传共享对象”.如果在被调函数中改变了形式参数的值,调用者是可以看到这种变化的

总结来说就是,传共享对象调用是传值调用的一种特例,因为传共享对象复制拷贝了一份实际参数的地址给形式参数,之所以没有将它视为传引用传递是因为传引用传递是把实际参数的地址引用直接传给形式参数

传值调用和传引用调用的主要区别:
传值调用是指在调用函数时将实际参数复制一份并传递到函数中,传引用调用是指在调用函数是将实际参数的引用直接传递到函数中。即实际参数是直接传递的,还是传递的是一个副本

4.Java中的求值策略

The Java Tutorials中关于对象传递有如下描述:

4.1基本类型

原始参数通过值传递给方法,这意味着对参数值的任何更改都只存在于方法的范围内。当方法返回时,参数将消失,对它们的任何更改都将丢失

4.2对象传递

引用数据类型参数(如对象)也按值传递给方法,这意味着,当方法返回时,传入的引用仍然引用与以前相同的对象。但是,如果对象字段具有适当的访问级别,则可以在方法中更改这些字段的值

这一点在官方文档中已经很明确地指出了,Java就是值传递,只不过时把对象地引用当作值传递给方法。这其实就是我们上面说地共享对象传递,也就是说Java会将对象地地址副本传递给被调用函数的形式参数,只不过传共享对象调用时传值调用的一个特例。

Java对象的传递是通过复制的方式把引用关系传递了,如果我们没有修改引用关系的话,而是找到引用的地址,把里面的内容修改了,则会对调用方有影响,因为形参和实参指的是同一个共享对象。反之如果修改之前的引用,则不会对原来的对象有任何影响

综上所述,Java中的求值策略是共享对象传递,完全正确.说Java中只有值传递,只不过传递的内容是对象的引用,也是正确的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coffee_babe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值