Java只有值传递

为什么写这篇文章

网络上说这个问题的文章非常多,但是真的能说明白的目前我没有找到。而且很大一部分是错误的,所以这里试着用通俗易懂的方式把这个话题说清楚,也希望大家对这个问题有个更好的理解

基本数据类型 值传递

基本数据类型使用值传递
这个基本没有什么问题。这个没有误解,先撇开基本类型值传递不谈了。

思考

  • 如果参数是引用类型,就是引用传递?这句话对吗?
    很多人以为传递的是对象的引用所以是引用传递,理解的误区就在这

先抛出结论 Java 没有引用传递 官方说的 而且绝对正确

  • Java 没有引用传递
  • Java 传递对象 确实是传递对象的引用。更确切的说是传递的对象引用的副本。
  • Java传递的是引用的副本。而不是引用本身,所以引用没有传递,所以这个不叫引用传递。

什么才叫引用传递? 为什么那么多人有误解

如果把引用也看做一个对象。那么引用传递的意思就是把这个引用对象传递给这个方法。而不是传递这个引用的副本。Java里传递的就是引用的副本,虽然这个副本也是引用。但是在Java中只能说是传递对象的引用,而不能叫引用传递。

首先这不是一个文字游戏,咬文嚼字,也没有意义。
因为有很多语言有引用传递,所以引用传递的概念是明确的。而且具体内容也是明确的。跟Java的对象传递是有本质区别的。

如何理解什么叫传递引用本身呢?

这里因为Java没有引用传递,所以先用C++ 简单解释一下,代码仿照Java代码
class TV{ 
    public String name; 
}
class User{
    public TV getTV(&TV tv){//C++可以这样来传递引用 而不是对象引用的副本  &TV 代表传入一个引用
         //这里传递一个TV 的引用 这个引用跟Java的引用是有区别的
         tv = new TV("xiaomi");//我修改为了小米牌的
         //如果在Java里 这句话不会影响传入的tv 但是 C++ 会影响
    } 
    
}  
public static void main(String[] args) {
   TV tv = new TV("shape"); // 这个是夏普牌的电视
   User son = new User();
  // User father = new User();
   son.getTV(tv);
   System.out.println(" TV is " + tv);
   // 我这是用Java写的伪代码 如果在Java里 这里打印的是shape 但是C++ 这个地方已经指向了xiaomi
   // 这就是引用传递和非引用传递的本质区别了 
} 

引用传递是真的把这个引用传递给了这个方法,这个方法修改引用的值,会改变传入的引用本身指向的值,这个传递叫做引用传递而Java只是传递引用的副本,所有这个不能叫引用传递。在Java里只能叫传递了对象的引用。而本质确是传递了对象的引用的副本。


最好理解的引用传递

这里用遥控器和电视机来简单理解什么是引用传递。

一台电视机
一个遥控器
这个遥控器可以操作电视机。
假设我们有一个电视机的对象

TV tv = new TV();  //创建了一个新的电视机对象。
这里的tv 是指向这个对象的 遥控器。 是一个指向电视机的引用。
这里应该很好理解。我只是把这个引用换了 一个概念而已
tv.changeChannel("CCTV5");// 通过遥控器调整频道。
tv.changeChannel("CCTV1");// 通过遥控器调整频道。
tv.changeChannel("CCTV9");// 通过遥控器调整频道。
这里也很好理解

现在我爸想看湖南卫视,他跟我说把遥控器给他。
Father{
    public TV getTV(TV tv);
}
Father father = new Father();
TV fatherTV = father.getTV(tv);
fatherTV.changeChannel("HNTV");
问题就在这里了。
Java中传递的对象的引用对吧?其实这句话是错的。Java中传递的是对象的引用的副本。
只是我们为了方便。直接说传递对象的引用,因为引用的副本也是对象的引用
这里还没有很绕,还是好理解的。

那么 在 电视机 和遥控器 的概念里。这个传递是怎么传递的呢
有两种方式。
第一种,我有一个遥控器直接给了 Father;
第二种,我新买了一个能遥控这台电视的遥控器给了Father。

第一种 是 我把遥控器传递给了 Father  
第二种 是 我拿了另一个遥控器给了 Father

这就是本质的区别。
第一种就是 引用传递。是遥控器真的传递给了Father。遥控器代表引用,所以是引用传递给了Father
而第二种 就是值传递。只是给了他一个新的遥控器。而我的遥控器没有传递。所以不能叫 遥控器传递 也就不能叫 引用传递。
用文字理解就是 这个概念。

总结

  • Java 没有引用传递
  • Java传递的引用的副本。而不是引用本身,所以引用没有传递,所以这个不叫引用传递。
  • Java传递的是对象的引用,更确切的说是传递的对象引用的副本。

理解

引用传递就是引用本身,传递给方法,所以叫引用传递。而Java传递的是引用对象的副本。所以Java的引用类型的参数传递不能叫引用传递。

Java引用对象的传递,传递的是引用类型的副本,或者说是引用类型的值,所以说Java是值传递,而不是引用传递。

其实这个概念确实非常绕,但是理解了之后对Java为什么不能实现 swap(Object &a, Object &b)还是有帮助的

就是因为Java没有引用传递,所以才无法实现swap 函数。

问题沟通

上面内容是个人总结,虽然经过多个版本,但是仍然需要完善
如果发现问题,希望大家指正,本人尽量及时修改,避免贻误他人,万分感谢
QQ 1400100300

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

推荐阅读更多精彩内容