对于Java的值传递, 你真的了解么? Java里面只有值传递, 这个值是什么? 如果是基本数据类型。 你也许回答的很干脆。 但如果是Object对象呢? 你确定清楚不? 先看下code。
package com.basic;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
StringBuffer buffer= new StringBuffer("colin");
SChange(buffer);
System.out.println( buffer);
}
public static void SChange (StringBuffer str) {
str= new StringBuffer("huang");
}
}
上面code, 输出的结果是什么? 你对了吗?
输出的结果是 colin.
我们修改下code
package com.basic;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
StringBuffer buffer= new StringBuffer("colin");
SChange(buffer);
System.out.println( buffer);
}
public static void SChange (StringBuffer str) {
//str= new StringBuffer("huang");
str.append(" huang");
}
}
输出的结果是 colin huang.
为什么是这样的结果呢? 下面详细解释:
Java确实通过引用来维护Object, 所有的Object变量, 都是一个引用。但Java在方法传递中, 确实是值传递。 那这个值是什么呢。 对于Object, 这个值就是传人的Object的引用。既把这个引用copy了一份。 那么, 就至少有两个引用指向了这同一个传入的Object。 参考下图:
那么, 我们就来图解下上面的那两个代码。
下图图解代码一
接着图解代码二
代码一中, copy的那个引用, 指向了一个新的对象。 但原对象还是没有变化的。
代码二中, copy的那个引用, 把原对象改变了。
这就是Java的值传递。

- 大小: 15.4 KB

- 大小: 29.7 KB

- 大小: 26 KB
分享到:
相关推荐
Lambda表达式可以被理解为没有名字的方法,它可以作为参数传递,也可以存储在变量中。例如,下面的代码展示了如何使用Lambda来遍历列表并打印元素: ```java Arrays.asList("a", "b", "d").forEach(e -> System....
4. **方法与构造器引用**:除了Lambda表达式,Java 8还引入了方法和构造器引用,它们可以更直接地将已有方法或构造器作为函数进行传递,进一步简化了代码。 5. **日期与时间API**:Java 8对日期和时间API进行了全面...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...
- **基本数据类型与引用类型的区别**:在Java中,基本数据类型如`int`、`double`等直接按值传递;而引用类型如`String`、数组等则按引用传递。 - **示例代码**:提供的代码示例中,`String`变量传递的是值,因此在...
《阿里巴巴Java开发手册》是Java开发者的一份重要指南,它集结了阿里巴巴技术团队的经验和...总之,这份终极版的手册是Java开发者不可或缺的工具,它不仅提供了具体的编程指导,更是提升软件开发职业素养的重要参考。
**Lambda表达式**是Java 8中最受瞩目的新特性之一,它允许开发者以更为简洁的方式定义匿名函数,并能够将其作为参数传递给方法或作为代码的一部分进行处理。这使得Java更加接近函数式编程语言的特点。 **语法格式**...
- `java.util.Hashtable` 是线程安全的键值对映射容器,不允许 null 键或 null 值。 - **位集合类 BitSet** - `java.util.BitSet` 用于存储位字段,可以高效地进行位操作。 **1.1.3 Java IO包** - **数据流** ...
Optional类也是Java 8的一个亮点,它是一个容器对象,可能包含或不包含非null值。Optional帮助我们避免空指针异常,鼓励更清晰的编程风格。通过`isPresent()`、`get()`和`orElse()`等方法,我们可以安全地处理可能为...
这份名为"Java_终极Android参考你的道路,成为一个更好的Android开发人员"的资源包,显然是为了帮助开发者提升在Android平台上的编程技能。它包含了一个名为"UltimateAndroidReference_master.zip"的主文件以及一个...
这个系统通常包括客户端和服务器两部分,客户端用于用户的交互界面,而服务器则负责处理用户之间的消息传递。在本项目中,描述指出该系统是用Java语言编写的,并且默认的服务器IP地址是本机IP,这意味着开发者可能在...
**Jacob使用说明终极吐血版** Jacob(Java和COM Bridge)是一个开源的Java库,它提供了在Java应用程序中调用Windows COM组件的能力。这个库使得Java开发者能够利用大量的已有的COM对象,比如Microsoft Office组件,...
- **事件(Event)**:传递的信息对象,通常是一个Java类,可以包含任意数据。 2. **安装与集成** 在项目中添加EventBus的依赖,可以通过Gradle的build.gradle文件添加: ``` dependencies { implementation '...
在这个“Java+TCP+SQL SERVER2005”项目中,我们看到的是一个用Java构建的网络通信软件,它利用TCP协议进行数据传输,并依赖于SQL Server 2005作为后端数据库管理系统,提供了用户登录、注册以及消息传递等功能。...
《w3cschool菜鸟教程【终极离线版】适合新手.rar》是一个综合性的学习资源,专为初学者设计,提供了全面的IT技术教程。这个压缩包涵盖了多种编程语言和技术,包括CSS、jQuery、JSON、PHP、jQuery(重复)、Python、...
在本项目中,Servlet扮演了接收用户请求,处理业务逻辑,然后将结果传递给JSP进行展示的角色。Servlet通过实现Servlet接口或继承HttpServlet类来实现其功能,比如用户登录验证、数据操作等。 【JSP(JavaServer ...
在Java Web开发中,JSP乱码和AJAX的应用是两个常见的主题。本文将深入探讨这两个话题,提供解决方案,并给出详尽的实践指导。 首先,让我们来解决JSP项目的乱码问题。乱码通常是由于编码不一致导致的,尤其是在处理...
1. **依赖管理**:Maven能够自动处理项目的依赖关系,包括依赖的下载、更新和传递性依赖。 2. **项目信息管理**:Maven使用统一的方式来管理项目信息,如项目名称、版本号、开发者信息等。 3. **标准化构建生命周期*...
开发者通常会用到Intent来传递数据和启动活动,使用SharedPreferences或SQLite数据库来存储用户信息。 其次,源码中包含了一系列的图片资源,如javaapk.com_0008.png到javaapk.com_0015.png,这些图片可能是应用的...
Spring框架是Java开发中的一个核心组件,尤其在企业级应用中广泛使用。本文将深入解析Spring框架5.0.2.RELEASE版本,该版本包含了详尽的中文注释,便于开发者理解和学习。我们将会探讨Spring的核心特性、模块组成、...
终极版 Java路线图 从 xsd 生成类 生成 SSH 密钥 Gradle 依赖 Gradle SSH 插件文档 Jenkins 环境变量在 Gradle 中处理文件 使用 -P 从命令行传递项目属性 如何为 jenkins 设置 ssh 密钥以通过 ssh 发布 角 + 詹金斯 ...