`
雨落夕晨
  • 浏览: 8928 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java值传递的终极解释

阅读更多

对于Java的值传递, 你真的了解么? Java里面只有值传递, 这个值是什么? 如果是基本数据类型。 你也许回答的很干脆。 但如果是Object对象呢? 你确定清楚不? 先看下code。

Java代码

 

 

  1. package com.basic;     
  2.     
  3. public class Test {     
  4.     
  5.     /**    
  6.      * @param args    
  7.      */    
  8.     public static void main(String[] args) {         
  9.         StringBuffer buffer= new StringBuffer("colin");     
  10.         SChange(buffer);     
  11.         System.out.println( buffer);     
  12.     }     
  13.          
  14.     public static void SChange (StringBuffer str) {     
  15.         str= new StringBuffer("huang");     
  16.     }     
  17.     
  18. }   

 

上面code, 输出的结果是什么? 你对了吗?

输出的结果是 colin.

我们修改下code

Java代码

 

 

  1. package com.basic;     
  2.     
  3. public class Test {     
  4.     
  5.     /**    
  6.      * @param args    
  7.      */    
  8.     public static void main(String[] args) {         
  9.         StringBuffer buffer= new StringBuffer("colin");     
  10.         SChange(buffer);     
  11.         System.out.println( buffer);     
  12.     }     
  13.          
  14.     public static void SChange (StringBuffer str) {     
  15.         //str= new StringBuffer("huang");     
  16.         str.append(" huang");     
  17.     }     
  18.     
  19. }    

 

输出的结果是 colin huang.

为什么是这样的结果呢? 下面详细解释:

Java确实通过引用来维护Object, 所有的Object变量, 都是一个引用。但Java在方法传递中, 确实是值传递。 那这个值是什么呢。 对于Object, 这个值就是传人的Object的引用。既把这个引用copy了一份。 那么, 就至少有两个引用指向了这同一个传入的Object。 参考下图:

 

 

那么, 我们就来图解下上面的那两个代码。

下图图解代码一

 

 

接着图解代码二

 

 

代码一中, copy的那个引用, 指向了一个新的对象。 但原对象还是没有变化的。

代码二中, copy的那个引用, 把原对象改变了。

这就是Java的值传递。

 

原文地址:http://qqdwll.javaeye.com/blog/970001

分享到:
评论

相关推荐

    Java 8新特性终极指南

    Lambda表达式可以被理解为没有名字的方法,它可以作为参数传递,也可以存储在变量中。例如,下面的代码展示了如何使用Lambda来遍历列表并打印元素: ```java Arrays.asList("a", "b", "d").forEach(e -> System....

    Java8新特性终极指南Java开发Java经验技巧共27

    4. **方法与构造器引用**:除了Lambda表达式,Java 8还引入了方法和构造器引用,它们可以更直接地将已有方法或构造器作为函数进行传递,进一步简化了代码。 5. **日期与时间API**:Java 8对日期和时间API进行了全面...

    java反序列化工具

    Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...

    java终极测试题(中兴.华维)

    - **基本数据类型与引用类型的区别**:在Java中,基本数据类型如`int`、`double`等直接按值传递;而引用类型如`String`、数组等则按引用传递。 - **示例代码**:提供的代码示例中,`String`变量传递的是值,因此在...

    阿里巴巴Java开发手册(终极版)

    《阿里巴巴Java开发手册(终极版)》是一本旨在提升Java开发者技术水平的专业指南,尤其对于初入职场或希望进一步提升的程序员来说,具有极高的参考价值。这本书由阿里巴巴集团的资深技术专家编写,集成了他们在实际...

    阿牛Java开发手册-终极版1

    《阿里巴巴Java开发手册》是Java开发者的一份重要指南,它集结了阿里巴巴技术团队的经验和...总之,这份终极版的手册是Java开发者不可或缺的工具,它不仅提供了具体的编程指导,更是提升软件开发职业素养的重要参考。

    Java 8的新特性—终极版

    **Lambda表达式**是Java 8中最受瞩目的新特性之一,它允许开发者以更为简洁的方式定义匿名函数,并能够将其作为参数传递给方法或作为代码的一部分进行处理。这使得Java更加接近函数式编程语言的特点。 **语法格式**...

    (超赞)JAVA精华之--深入JAVA API

    - `java.util.Hashtable` 是线程安全的键值对映射容器,不允许 null 键或 null 值。 - **位集合类 BitSet** - `java.util.BitSet` 用于存储位字段,可以高效地进行位操作。 **1.1.3 Java IO包** - **数据流** ...

    java源码导读-Java-8-Feature-eBook-Source-Code:该存储库包含我的电子书“Java8功能终极指南”中提到的源

    Optional类也是Java 8的一个亮点,它是一个容器对象,可能包含或不包含非null值。Optional帮助我们避免空指针异常,鼓励更清晰的编程风格。通过`isPresent()`、`get()`和`orElse()`等方法,我们可以安全地处理可能为...

    Java_终极Android参考你的道路,成为一个更好的Android开发人员.zip

    这份名为"Java_终极Android参考你的道路,成为一个更好的Android开发人员"的资源包,显然是为了帮助开发者提升在Android平台上的编程技能。它包含了一个名为"UltimateAndroidReference_master.zip"的主文件以及一个...

    java多人聊天系统

    这个系统通常包括客户端和服务器两部分,客户端用于用户的交互界面,而服务器则负责处理用户之间的消息传递。在本项目中,描述指出该系统是用Java语言编写的,并且默认的服务器IP地址是本机IP,这意味着开发者可能在...

    【EventBus】程序组件之间的数据(事件)传递终极解决方案

    - **事件(Event)**:传递的信息对象,通常是一个Java类,可以包含任意数据。 2. **安装与集成** 在项目中添加EventBus的依赖,可以通过Gradle的build.gradle文件添加: ``` dependencies { implementation '...

    jacob使用说明终极吐血版

    **Jacob使用说明终极吐血版** Jacob(Java和COM Bridge)是一个开源的Java库,它提供了在Java应用程序中调用Windows COM组件的能力。这个库使得Java开发者能够利用大量的已有的COM对象,比如Microsoft Office组件,...

    Java+TCP+SQL SERVER2005

    在这个“Java+TCP+SQL SERVER2005”项目中,我们看到的是一个用Java构建的网络通信软件,它利用TCP协议进行数据传输,并依赖于SQL Server 2005作为后端数据库管理系统,提供了用户登录、注册以及消息传递等功能。...

    w3cschool菜鸟教程【终极离线版】适合新手.rar

    《w3cschool菜鸟教程【终极离线版】适合新手.rar》是一个综合性的学习资源,专为初学者设计,提供了全面的IT技术教程。这个压缩包涵盖了多种编程语言和技术,包括CSS、jQuery、JSON、PHP、jQuery(重复)、Python、...

    servlet+jsp+modle+sqlser雷人项目

    在本项目中,Servlet扮演了接收用户请求,处理业务逻辑,然后将结果传递给JSP进行展示的角色。Servlet通过实现Servlet接口或继承HttpServlet类来实现其功能,比如用户登录验证、数据操作等。 【JSP(JavaServer ...

    深入挖掘:Maven依赖树命令的终极指南与实战技巧

    1. **依赖管理**:Maven能够自动处理项目的依赖关系,包括依赖的下载、更新和传递性依赖。 2. **项目信息管理**:Maven使用统一的方式来管理项目信息,如项目名称、版本号、开发者信息等。 3. **标准化构建生命周期*...

    Android应用源码高仿安卓人人梦想终极版.zip

    开发者通常会用到Intent来传递数据和启动活动,使用SharedPreferences或SQLite数据库来存储用户信息。 其次,源码中包含了一系列的图片资源,如javaapk.com_0008.png到javaapk.com_0015.png,这些图片可能是应用的...

    JSP乱码终极攻略和AJAX初步运用

    在Java Web开发中,JSP乱码和AJAX的应用是两个常见的主题。本文将深入探讨这两个话题,提供解决方案,并给出详尽的实践指导。 首先,让我们来解决JSP项目的乱码问题。乱码通常是由于编码不一致导致的,尤其是在处理...

    spring-framework-5.0.2.RELEASE-中文注释版-终极完美版.rar

    Spring框架是Java开发中的一个核心组件,尤其在企业级应用中广泛使用。本文将深入解析Spring框架5.0.2.RELEASE版本,该版本包含了详尽的中文注释,便于开发者理解和学习。我们将会探讨Spring的核心特性、模块组成、...

Global site tag (gtag.js) - Google Analytics