[Java基础]java中函数参数传递

按值传递还是引用传递?

java中将参数传递给方法时到底是只有按值传递还是值传递与引用传递都存在,有几次都看到了这方面的争论。最近遇到了这方面的问题,回过头来好好分析一下,与大家分享顺便加深理解。


一些理解参数传递的基本知识

基本类型和引用类型在内存中的如何保存

java数据类型分为两大类:基本类型对象类型
基本类型包括:

byte,short,int,long,char,float,double,boolean

引用类型包括:

类类型,接口类型和数组

相应地,变量类型也就分为基本类型和对象类型变量。基本类型的变量直接保存原始值,即它代表的值就是数值本身。对象类型的变量保存一个引用值,引用值指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

变量的基本类型和引用类型的区别

基本类型变量在声明时,虚拟机在栈中分配空间,存放其变量名和值:

int a;

引用类型的变量在声明时,虚拟机先在栈中分配一块空间,存放其引用值。在实例化的过程中,虚拟机又在堆中分配一块空间,存放该变量的值,并将空间的首地址赋值给引用值:

Student student;// 此时在栈中分配空间存放其引用值
student = new Student();// 堆中分配一块空间,存放该变量的值,并将空间的首地址赋值给引用值
student.getName();// 如果注释掉上一步操作,则会报错:The local variable date may not have been initialized,也就是说student对象的数据空间还没有分配,无法使用

传递方式的讨论

那么,到底java中参数的传递方式是怎样的呢?其实每个人都可以有不同的理解,个人偏向于java中参数传递方式只有值传递,可以按照以下思路来理解:

不管是基本类型还是引用类型,函数中形参只是实参的一个拷贝,对形参的修改都不会影响到实参。

对于基本类型的变量,由于形参是实参的一个拷贝,因此形参的改变当然不会影响到实参的值。那么,引用类型的变量进行传递时,修改形参会对实参造成影响,又该怎样理解呢?

因为形参是实参的一个拷贝,都是指向堆中引用对象的地址,指向了同一个对象。所以,形参所指向的对象的修改会影响到实参所指向的对象。

结论

个人认为可以认为java中只有值传递。只是引用类型传递了引用值的拷贝,对地址的修改会影响到实参所指向的对象。同时,这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们都是immutable类型,因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以对形参的改变不会影响到实参。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值