JAVA中方法的值传递对参数(可变和不可变)的影响
来源:互联网 发布:淘宝没有访客怎么办 编辑:程序博客网 时间:2024/05/21 09:32
前段时间写项目的时候,遇到一个很有趣问题,我把内容简化一下放上来
例如一个方法要求我传入一个自定义参数,然后将其改变状态
public class Dog { public Integer legs = 4; public Integer getLegs() { return legs; } public void setLegs(Integer legs) { this.legs = legs; } public void addLegs(Dog dog){ dog.setLegs(dog.getLegs()+1); } public static void main(String[] args) { Dog dog = new Dog(); System.out.println("legs-->"+dog.getLegs()); dog.addLegs(dog); System.out.println("legs-->"+dog.getLegs()); }}
输出的结果自然是dog的legs属性变成了5
五条腿的狗!
这段类似的代码被我铭记于心,明白了引用数据类型的状态是可以在方法体内改变的,基本数据类型?基本数据类型连状态都没有,何谈改变?值传递你懂吗?方法体内部对形参(传入的参数)变量的操作是进行在传入的形参的copy上的,不是在直接操作这个变量!
比如将方法改成:
public void addLegs(Dog dog){ dog = new Dog(); dog.setLegs(dog.getLegs()-1);// dog.setLegs(dog.getLegs()+1); }
输出的结果,自然是变成了两个4
直到又过两天,遇到了类似以下这段代码
public void changeString(String str){ str = str+"!"; }
这个方法无论用什么姿势传入参数都不会修改原本参数对应的值,当时博主心里相当卧槽,不是说好都是引用数据类型吗?怎么你不一样啊
类似的还有
public void changeInteger(Integer i){ i = 8; }
不管是传1到9999999999都不会影响改变原有参数的值,这时如果没仔细了解,光看这些源码其实是很难理解的,甚至会产生“难道只有我自己定义的类才是引用数据类型?”这种想法,陷入深深的自我怀疑
到底是初学者学艺不精,还有培训班老师也不给力,这个问题虽然不大,用处也几乎没有,但总萦绕脑海久久不去。
原来,八种基本数据类型的包装类和String类是不可变的,每对其进行一次赋值或者改变其状态,都会将原本的变量指向一个新的对象,即改变了原有对象的地址,在这个方法体内就是将形参/copy指向了新的地址,而原有的实参指向的原来的对象并没有改变才导致了这样的结果。如果使用其它JDK中可变的类,比如StringBuffer就不会出现这种情况
避免三个错误认知:
1.变量当中存储的就是对象的值,或者说状态
2.方法体内的赋值和方法体外无关,只有返回值和方法体外有关
3.不了解可变对象和不可变对象
- JAVA中方法的值传递对参数(可变和不可变)的影响
- javascript中不可变的原始值和可变对象
- 可变参数和不可变参数的比较
- python中可变和不可变对象(复值,拷贝,函数值传递)
- OC中不可变数组和可变数组的操作方法
- Java的可变类和不可变类
- java的可变类和不可变类
- python的可变和不可变对象
- 微服务的可变和不可变
- 不可变的原始值和可变的对象引用
- 不可变的原始值和可变的对象引用
- 可变参数传递的方法
- Java 可变参数的传递
- java中可变类型和不可变类型
- Java中可变类型和不可变类型
- 关于Python参数传递时,传递可变对象(mutable)和不可变更对象(immutable)的误区
- python函数参数是值传递还是引用传递:取决于对象内容可变不可变
- java方法中参数的传递机制(值传递)
- 【NOIP2017模拟】猫&种花
- 创建tomcat的服务,删除服务,通过服务来启动项目
- java导出excel封装成工具类
- 580
- IDEA配置JavaWeb项目
- JAVA中方法的值传递对参数(可变和不可变)的影响
- MySQL初步学习5:常用语句
- php操作redis服务之Predis
- 2017年11月9日训练笔记
- 关于itchat学习的一些资料
- 基于Cookies的会话跟踪技术
- metasploit 情报搜集技术【2】主机探测与端口扫描
- 使用本地wamp服务器解决ajax访问本地文件失败问题
- C与指针 1-3章