java的值传递和引用传递

大家好我是白泽。

这篇打算讲讲java开发中新人要知道的一些事情吧

对象引用和值引用,这个是在基础不过的知识了,但好多人特别是小白经常会忽略这问题,lz当初也是。如果你是大牛可以当看看或者直接跳过呗。

提到这个概念我们先来大概了解下java中堆栈的东西,老话再谈,“栈”是存放java对象中的基本组成数据也就是所谓的基本数据类型和对象的引用,栈里的东西执行时都是单线程,你也可以理解为当有线程访问栈里的东西时栈都会克隆出一份新的让新线程操作,所以栈里的东西一般不存在线程安全问题。而“堆”存放就就是对象的信息栈中的引用会指向堆中这块对应的内存,在堆里一个对象只有一块内存,但可以被栈中多个引用地址引用,这就会出现一个应用改了这个对象其他引用取到的值也会相应的变化,这就会存在线程安全问题。当然线程这东西比较不好理解,这篇博客也不是和大家讲线程的所以大家只要知道栈中的数据一般不存在线程安全问题,而堆中的数据就会有线程安全问题暂时就够了。

今天我们要讲的是我们平常开发必不可少的操作“传参”,传参就是往一个方法中传递参数,那这个又有什么好注意的呢?让lz一一道来,首先参数部分会有基本数据类型和对象引用构成那这个基础数据类型就是我们今天要讲的值传递,而对象引用就是对象的引用传递。大家也可以暴力一点记成在java中的参数里基础数据类型的参数就是值传递,对象就是一个引用传递。在这里新人要注意的是传进来的的参数如果是值引用可以随便的修改,因为上面说过它是存放在栈中是线程安全的,每次访问都会复制出一份出来所以相互之间不会影响。而引用传递就不是这样。首先需要注意的是,如果传进来的对象有这么个需求“你想用别人写的对象然后将它的引用作为方法参数传进来”那么这个对象在你的方法中切记千万不要直接的修改该类的数据和状态。因为可能只是你想要这个对象的数据变化而写这个对象的同事或者其他使用这个对象的同事并不希望这对象的值有变化,这时你要是直接修改的话那就会出现后期可能连你自己都不知道的bug而且这种bug不容易找出来。为什么会出现这种情况呢?上面提到过,对象是放在堆中的如果你使用的时候不是重新new出来一个那么你使用的引用也是指向和别人使用的同一块内存,这样你改了别人当然也会有变化。这其实也算是一种线程安全的表现吧。

那么如何避免这种bug呢?首先如果你只是想用这个对象而不是对象里的别人的数据,那你只要自己new出来然后自己赋值初始化再传进去就可以。因为使用new关键字创建的对象会在堆内存中分配一个新的内存给你这个对象,同样在栈中也会生成一个新的引用给你。那要是想用别人的数据呢?这就要使用克隆的方法去把该对象克隆出来再使用或者自己提供一个该对象的克隆方法即:new出一个新对象之后再把另一个对象的数据set进去再使用就好。另外比较快捷的方式就是实现java提供的Cloneable接口重写它的clone方法再使用,但这个方法只是浅复制,也就是说它只会复制对象里存在栈里边的数据也就是基本数据类型的数据,而如果这个对象有其他对象的引用那么如果你修改那个被引用的对象还是会被修改掉,除非你再使用这个方法再给那个对象进行克隆。但是这种方式是不是听着就感觉很low?,别急,试试下一种。就是实现java提供的Serializable序列化接口再使用io对其进行序列化,再反序列化回来的对象就是一个全新的对象,也就是说在堆中有自己的内存地址,对其修改不会影响别人的对象的数据。

下面看一个内存图,其中有两个对象引用同时指向同一个对象,而此时一个修改数据,一个获取数据但是操作的都是同一个对象的数据这样就会参生数据错乱的额情况

好了,第一遍入行博客就写到这了,以后讲讲在工作中的经验和积累,大家有兴趣可以关注微信公众号 baize1935 获取更过文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容