`
Ivan_Pig
  • 浏览: 384787 次
  • 性别: 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  
分析的很对 对于基本类型就是传的值了,而对于对象类型就是引用了

相关推荐

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

    在模拟数字转换器(ADC)的设计和应用中,有两个关键参数常常引起争论:有效位数(ENOB)和有效分辨率。这两个术语都涉及到ADC的分辨率,但它们在衡量ADC性能时有着不同的侧重点。 首先,ADC的分辨率位数(N)是指ADC能够...

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

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

    大论战:CPU、GPU谁更重要?.pdf

    随着计算机技术的发展,人们开始关心谁更重要:CPU还是GPU?这场大论战牵涉到计算机行业的未来发展。 在视觉计算时代,GPU的重要性日益增加。NVidia迅速抛出了“双Pu杨厶论”,认为GPU的重要性将超越CPU。英特尔...

    市场经济学批判规划.doc

    14. **第十四章:关于最低工资与价格管制的争论** - 最低工资政策的利弊,以及价格管制如何影响市场运作。 15. **第十五章:消费行为的双重性与边际效用理论的失误** - 消费者的心理和行为分析,以及边际效用理论在...

    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作为当前最受广泛使用的编程语言而尤为突出。 这场争论在支持模拟组件...

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

    **争论机器人:macOS终端中的语音合成技术与交互体验** 在现代科技的推动下,人工智能和机器学习领域的发展日新月异,其中一种引人入胜的应用就是语音合成技术,也被称为文本转语音(Text-to-Speech, TTS)。本文将...

    java编程常用英语单词解释

    Java 编程常用英语单词解释 在 Java 编程中,英语单词是必不可少的一部分。了解这些单词的解释将有助于我们更好地理解和使用 Java 语言。下面是 Java 编程常用英语单词的解释: 1. Abstract(关键字):抽象的,指...

    java常用词汇汇总

    ### Java常用词汇详解 #### abstract (关键字) - **中文释义**:抽象 - **英文发音**:['.bstr.kt] - **用途**:在Java中,`abstract`是一个关键字,用来定义抽象类或者抽象方法。抽象类是不能被实例化的类,通常...

    考拉四级听力原文文件稿

    - **关键点**:理解“the best part”(最精彩的部分)指的是 Jim 和 Kendrick 先生之间的争论。 2. **对话2** - **对话内容**: - M: 这周末你能跟我一起去湖边吗?你会在那里找到很多乐趣。 - W: 让我想想看...

    初中语文语文论文课堂教学改革难题及对策对策之一:课堂越活越好吗?

    此外,教师在应对学生的提问和争论时,可能会感到困惑,不知道如何回应或评价。这种情况下,教师的角色应当是倾听、引导和组织,而不是一味地赞扬或者忽视。教师应能识别和聚焦核心问题,以促进有意义的课堂讨论。 ...

    证券行业深度报告:证券股究竟是成长股还是周期股?.zip

    证券股,即证券公司的股票,因其特有的行业性质,常常引发投资者对其属性的争论:是成长股还是周期股?这涉及到对证券行业特性的理解、宏观经济环境的影响以及公司盈利模式的分析。 首先,成长股通常指的是那些在较...

    高考作文写作训练:面对不同观点立场,我们应该展开辩论还是保持沉默?(附文题详解及范文展示).pdf

    然而,辩论并不意味着无休止的争论,更不意味着要强加自己的观点于人。正如“ 对牛弹琴” 的典故所示,面对无法沟通的对象,保持沉默也许是一种更为明智的选择。有时,人们的思想差异源于各自的生活经历、知识背景,...

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

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

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

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

Global site tag (gtag.js) - Google Analytics