`
Ivan_Pig
  • 浏览: 381978 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

争论话题:Java传值还是传引用?

阅读更多
     辞职专心找工作了。没事干就开始啃那本买了一年多都还没看的Thinking In Java。巩固巩固基础吧
     Java传值还是传引用好像自Java出现后就一直存在争论,大家各持己见。这里阐述下自己的理解,算是对Thinking in Java的一个读书笔记。
     一.预备知识
     在Thinking in Java的第二章里,提到了Java将对象存放到了哪里。这里主要看栈和堆。
     看下面几行代码的区别。
int i = 1;
String str = new String("Hello");

     从第二行代码里又可以引申如一个经典的面试题,这里创建了几个String对象。这里不做讨论。
     大家都知道左边的是引用,指向了右边的实际的值。但是在Java里面这两段有区别吗?看图。



    从图上可以看出,栈里的每个值又可以看成是一个个的键值对。
    对于
int i = 1;

    来说,键就是变量i,而值就是1。
    而对于
String str = new String("Hello");

    来说,键是变量str,而值是new String("Hello");在堆里的地址。(在Java中所有new出来的东东都在堆里面)

     二.传值还是传引用?
     好,知道了上面的区别,对于传值和传引用的理解就很有帮助了。
     看下面的代码。
public class Change {
	public void change(int i){
		i = 2;
	}
	
	public void change(String str){
		str = "Ivan";
	}
		
	public void change(StringBuffer str){
		str.append(" World");
	}
}

     那么将上面的i和str传入如下的三个方法中是否有作用呢?(这里添加了一个StringBuffer,是因为你无法改变String)
     再来看下Java中的方法如何执行的。在Thinking in Java第七章中,提到了一点。方法的执行是将参数压入栈中,跳至方法代码处执行方法,然后跳回并清理栈中的参数,处理返回值。从这里可以知道,方法的参数在栈里面也有对应的存储空间,而值就是传入的i和str在栈中所对应的值。也就是说,是i和str的一个拷贝。
     那么来看上面的三个方法。
     对于第一个方法,从上面可以知道,这里的i和原来的i已经不是同一个i了,所以这里操作的是完全不同的东东。
     第二个方法和第一个相似,根据前面知道,这里的str持有的是指向"Hello"的引用。但是这里直接将这个引用改成了指向"Ivan"的,原来的str还是指向"Hello",对原来的str没有一点影响。
     第三个方法是是直接操作了str所指向的那个"Hello",因为原来的str指向同样的"Hello",所以这就会改变原来str的值了。

    三.总结
    从上面可以知道,Java是将栈里的值拷贝了一份作为参数传到了方法里面。对于基本类型就是传的值了,而对于对象类型就是引用了。不管传的是值还是引用,都是栈里的拷贝。记住这一点应该就不会再有什么疑问了

    四.关于数组
    继续看Thinking in Java,关于数组一节的介绍,有这么一句。无论使用的是哪种类型的数组,数组标示符其实只是一个引用,指向在堆中创建的一个真实对象,这个(数组)对象用以保存指向其他对象的引用。
    再结合上面的内容,下面两个方法能否改变值应该能知道吧
public void change(int[] i){
		i[0]=1;
	}
	
	public void change(String[] str){
		str[0]="Ivan";
	}

   
  • 大小: 16.7 KB
8
0
分享到:
评论
2 楼 suu 2012-02-11  
都是栈里的拷贝  这句话让我从一头雾水到豁然开朗 谢谢了.
1 楼 longdechuanren 2010-04-13  
分析的很对 对于基本类型就是传的值了,而对于对象类型就是引用了

相关推荐

    java的传值与传引用详解

     Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。既然争论中提到了引用这个东西,为了搞清楚这个问题,我们必须要知道引用是什么。  简单的说,引用其实就像是一个对象的名字...

    JAVA中传值与引用问题

    传值和传引用的问题一直是Java里争论的话题。与C++不同的,Java里面没有指针的概念,Java的设 计者巧妙的对指针的操作进行了管理。事实上,在懂C++的Java程序员眼中,Java到处都是精美绝伦的指 针。

    争论的焦点:是 ENOB 还是有效分辨率?

    您可能知道,有效位数 (ENOB) 和有效分辨率都是与 ADC 分辨率有关的参数。理解它们的区别并确定哪个更具相关性,是令 ADC 用户与应用工程师等极为困惑的问题,经常因此发生争论。您认为哪个更重要?

    解决数字市场中的勾结:竞争法足够了吗?-研究论文

    虽然这个问题在印度的法律背景下没有太多争论,但 CCI 正在进行的对航空业算法定价指控的调查使得必须询问是否可以根据印度现行法律起诉使用算法的勾结. 本文探讨了定价算法对印度现有法律框架构成的挑战,并评估了...

    java按值传递还是按引用传递详细解说

    这个在Java里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论:“在Java里面参数传递都是按值传递”。事实上,这很容易让人迷惑,下面先分别看看什么是按值传递,什么是按引用传递,只要能正确理解...

    争论机器人::robot_face:观看并听到macOS机器人在您的终端中进行现场辩论:robot_face:

    争论机器人::robot_face:观看并听到macOS机器人在您的终端中进行现场辩论:robot_face:

    JAVA.WEB服务.构建与运行

     不管是学生还是有经验的程序员,当你需要立即运用这些技术展开工作时,《Java Web服务:构建与运行》都是你需要的一本理想的简明指南。 内容截图 目录: 前言. i 第1章 java web服务快速入门 1 1.1 什么...

    mastodon-tags-analyser:Java中Mastodon标签的分析器

    简单的方法mvn exec:java 有一些争论mvn exec:java -Dexec.args="zaclys" 外部有用文件 客户端API概述: : 结果 这张图片是用这些数据实现的: zaclys associations [académique, actu, actulibre, aide, ...

    java swt 小程序

    Java GUI 工具包一直是一个倍受争议的话题。同样的争论也发生在其他编程语言如Smalltalk。实际上每个平台无关的语言都存在着这样的争论。Java作为当前最受广泛使用的编程语言而尤为突出。 这场争论在支持模拟组件...

    转基因技术的伦理争论:困境与出路.doc

    转基因技术的伦理争论:困境与出路.doc

    美股医疗保健行业医疗中的主要争论:家庭健康股的问题是什么?2021.6.7(25页).pdf

    美股医疗保健行业医疗中的主要争论:家庭健康股的问题是什么?2021.6.7(25页).pdf

    java 常用英语词汇大全

    java 常用英语词汇大全 部分内容如下: algorithm n.算法['.lg.riem] annotation [java]代码注释[.n.u'tei..n] anonymous adj.匿名的[.'n.nim.s]‘ (反义:directly adv.直接地,立即[di'rektli, dai'rektli]) apply ...

    转录调控:磷酸肌醇信号的新领域?

    然而,这里将争论的是,现有数据并不完全支持 Arg82 在转录中的这种直接作用。 还将讨论这些发现与高等生物的潜在相关性。 BioEssays 22:786±789, 2000. Published 2000 John Wiley & Sons, Inc. 介绍 图 1 ...

    2014热门、具争议的10个Java话题

     2014年对于Java来说是令人兴奋的一年,万一你不幸错过了在过去一年中Java发生的那些翻天覆地的变化和关于Java的在线争论,也没有关系,接下来将为你呈上2014年发生在JVM的动荡的谈论话题。  1、Java8已经到来。...

    Java Web服务构建与运行(高清中文版).part1.rar

    Java Web服务:构建与运行 作 者: (美)卡林 著,任增刚 译 出 版 社: 电子工业出版社 出版时间: 2009-11-1 目录 前言 第1章 Java Web服务快速入门  1.1 什么是Web服务  1.2 第一个例子  1.3 由Perl和...

    joind-ex042015:使用 Java 8 Stream API 和 R 进行命名与匿名评论分析的练习

    Codemotion Rome 2015 - 一个非常有趣的意大利技术会议 - 几天后,在社交媒体上开始了一场小对话,争论在会议上举行的几次谈话的匿名评论和匿名评级的可靠性和有效性。 我的观点是,与会者留下匿名反馈的原因与缺乏...

    整理后java开发全套达内学习笔记(含练习)

    争论,论据 ['ɑ:gjumәnt]'(缩写 args) assert (关键字) 断言 [ә'sә:t] ' (java 1.4 之后成为关键字) associate n.关联(同伴,伙伴) [ә'sәuʃieit] attribute n.属性(品质,特征) [ә'tribju:t] boolean ...

    ProcessMonitor:一个Java应用程序,用于监视和记录进程的开始和停止时间

    要求:java 8争论java ProcessMonitor <process> <log> <error> <time>--process-name = <进程名称>:要监视的进程的名称。 (不带扩展名)强制性--log = <log>:保存进程日志的目录。 默认值:当前工作目录--...

Global site tag (gtag.js) - Google Analytics