java的值传递笔记
1. 背景:开发小伙伴突然问我java是值传递还是引用传递,我说当然是值传递,只不过有时候传递一个对象时实际传递的是对象的地址值,所以让人容易产生一种引用传递的假象,貌似在李刚的疯狂java讲义有提到值传递。
2.于是,今晚就写起代码来验证一下,我去,居然纠结了一段时间。
因为直接写一个方法,带上基本类型和包装类型来一同做校验,思路是:
方法内,对形参进行加减操作,以便查看是否实参也会改变值(如果是值传递,基本类型是不会影响到实参的值的,引用类型的话,改变值一般会改变实参的值,我指的是成员值,当然有点特别,后续会提到);
再者,对形参做赋值,看是否实参也会改变值(基本类型,赋值不会影响到实参,引用类型赋值也一样不会影响到,不然不就引用传递了么)
于是代码就这么写了,包括了int,Integer,String,和自定义类
package study; /**
* Created by dell on 2014/6/18.
*/
public class StudyTrans {
public void methodWithTypes(int base, Integer obj, ObjD od, String str){
base +=100; //验证修改参数值是否改变实参值
Integer other = new Integer(base);
obj+=120;//验证修改引用的实际内容
System.out.println(obj.toString());
System.out.println(obj.intValue());//验证上一句是否能有效执行
obj = other; //验证赋值形参是否影响实参,影响则为引用传递
od.od +=100; //验证修改形参引用的内部值
od = new ObjD(80); //同obj =other
str += "ba";
str = new String("nimei");
}
public static void main(String[] args){
StudyTrans st = new StudyTrans();
int t = 10;
Integer o = new Integer(1024);
ObjD od = new ObjD(10);
String str = "hehe";
st.methodWithTypes(t, o, od, str);
System.out.println(t+" "+ o+" "+ od.od+ " "+ str);
}
}
class ObjD {
int od = 20;
ObjD(int t){
od=t;
}
}
结果呢?打印出来的数据:
1144
1144
10 1024 110 hehe
Disconnected from the target VM, address: '127.0.0.1:9751', transport: 'socket'
除了自定义类,其他参数都没有被方法搞到值有所变化,这本来也没错,可是,除了int,其他都是引用类型呀,不是应该可以改变其内容的成员值么?
经过一番谈论和思考,终于明白了,朋友说,源代码Integer里的私有成员int类型是final不可变的,因此一旦出现obj+=120;实际上相当于obj=new Integer(xxx);了。
是么?
在编译器上看一下地址值变化:

刚开始,还没执行方法内的赋值以及加减操作之前,实参地址分别是 @427, @428,@429 (o,od,str)
然后执行了看方法里的形参地址值:这里other是new的,所以地址是@430 (新的值),其他都说明了是值传递(地址值传递)

再看执行加减操作后的:

看,obj立马就变了值,同时地址值也由@427变成了@475
再看看赋值后:obj赋值了other,地址值有变成了@430,str操作后也换了新的地址。

以上,也就明确了,为什么包装类修改值不会影响到实参,因为修改值相当于new操作,相当于重新赋值地址值了,而本身又是值传递,不对地址值的那块地址内容做修改,也就不会有实参变化。
因此可以明确,java参数是值传递,因为对象传递的地址值传递特殊性往往让人觉得是引用传递。
不过我现在不会这么认为了。
java的值传递笔记的更多相关文章
- Java 为值传递而不是引用传递
——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...
- java是值传递还是引用传递
首先写一个简便的Employee,以便测试使用. class Employee { private String name; public Employee(String name) { this.n ...
- Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结
这个话题一直是Java程序员的一个热议话题,争论不断,但是不论是你百度搜也好还是去看官方的文档中所标明的也好,得到的都只有一个结论:Java只有值传递. 在这里就不贴代码细致解释了,让我们来看看一些论 ...
- java面试3-对于java中值传递的理解(Hollis)
这是根据Hollis的直面java内容习得(有兴趣的可以加他微信公众号) 对于初学者来说,要理解java中的值传递很难理解,为什么说java只有值传递?那引用传递呢? java中的错误理解: 错误理解 ...
- Java是值传递还是引用传递?
Java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题.这个问题一般是相对函数而言的,也就是Java中所说的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法的两 ...
- 堆栈详解 + 彻底理解Java的值传递和引用传递
本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...
- java的值传递机制
一.练习:编写Java程序,将二维数组中的行列互调显示出来. 代码1为自己编写: package com.xxgpra.CH6; public class Hangliehudiao_pra4 { p ...
- Java只有值传递(Java值传递还是引用传递?)
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10830521.html 一:区分Java数据类型.变量类型 Java数据类型分两种:基本数据类型.引用类型. ...
- Java的值传递和引用传递的说法
学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java ...
随机推荐
- DevExpress Ribbon右上角button显示文本设置
设置ribboncontrol.ShowItemCaptionsInPageHeader 属性为true
- Python之str()与repr()的区别
Python之str()与repr()的区别 str()一般是将数值转成字符串,主要面向用户. repr()是将一个对象转成字符串显示,注意只是显示用,有些对象转成字符串没有直接的意思.如list, ...
- 12. UITextField
1. UITextField 的认识 UItextField通常用于外部数据输入,以实现人机交互.比如我们QQ.微信的登录界面中让你输入账号和密码的地方 2. UITextField 控件的属性设置 ...
- oracleDBA-D3
1.静态参数文件 PFILE:使用操作系统提供的VIM进行编辑,包含多个参数文件 参数文件名是:init.ora(如: D:\app\Administrator\admin\orcl\pfile) 其 ...
- MVC Code First 自动生成数据库时生成的表名会多了一个s
如图:我的类文件都是不带s的
- js中属性节点的应用
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 北漂的生活 - python 面试
第一次来北京,先谈谈感受吧.都说北京的雾霾非常严重,可能是我来的时间短,暂时我还没有遇到特别恶劣的天气,感觉还是很美好的.和朋友住在顺义,出去一次真的远啊,旁边暂时还没有找到清真的饭馆(本人少数民族) ...
- [Python数据分析]新股破板买入,赚钱几率如何?
这是本人一直比较好奇的问题,网上没搜到,最近在看python数据分析,正好自己动手做一下试试.作者对于python是零基础,需要从头学起. 在写本文时,作者也没有完成这个小分析目标,边学边做吧. == ...
- 搭建自己的LAMP
LAMP的搭建说简单也简单,说难也不容易,如果采用一键安装也是比较容易的,但想配置自己需要的版本等等也是比较麻烦.前段时间我分别在自己的电脑和阿里云上部署了Lamp环境,以下是步骤和常出现的问题的解决 ...
- javase-排序
public class sort { public static void main(String[] args) { String[] arr = {"aa","bb ...