对于Java方法的参数传递形式到底是值传递还是引用传递,理解方式有两种
1,对于基础数据类型而言,在调用方法时方法的形式参数指向了原数据的copy,从而方法内部不会修改原数据
2,而参数为对象时,方法的形式参数与原引用同时指向一个对象,所以可以改变原对象,对于String类型则属于特例,由于String一旦创建则不能修改,所以方法内对数据进行修改,其实是新创建一个对象,并非对原有String对象进行修改
public class PassByValue
{
public static void main(String[] args)
{
String str = "abc" ;
System.out.println(str.hashCode());
changeValue(str);
System.out.println(str);
}
public static void changeValue(String a)
{
System.out.println(a.hashCode());
a = "bcd" ;
System.out.println(a.hashCode());
}
}
输出结果:
96354
96354
97347
abc
另,可以参考http://blog.csdn.net/faintbear/archive/2004/11/29/198021.aspx
我不记得自己是怎么学到的,但是我相信绝大部分从事java学习Java的人都一直这么以为一个小的技术问题:
在Java中方法参数的传递,对象是传递引用,基本数据类型是传递值。而且一直一来都似乎没有人提出过疑问。
直到最近,我在为公司基本Java开发人员编写考试试卷的时候,我才发现,这错了!在方法中,Java语言中对象传递的是地址,而不是引用,这两个概念是有非常大的差别的,我相信熟悉c++的人都应该知道。
例如下面:假设对象Test有name的属性。
public void call(Test t) {
Test t2 = new Test();
t2.setName("cba');
t.setName("abc");
t = t2 ;
}
public static void main(String[] arg) {
Test obj = new Test();
call (obj) ;
System.out.println("obj"+obj.getName());
}
这个时候,你们可以发现,打印出来的是"abc" ,而不是"cba",原因是这样的,在这次调用中,等于声明了两个变量obj , t,它们指向的是同一个地址,调用call方法,只是将obj指向的地址传递给了t,而obj本身并没有传递过去(也就是没有传递引用),当你重新赋值的时候(也就是将对象引用指向其他存储空间),等于只影响了t,而没有影响obj。
这样的传递方式只能称之为址传递,或者是引用对象传递,而不嫩说是传递引用或者引用传递。
我不知道这究竟属于翻译的错误,还是我们理解的错误。但是这样的问题在c++中是有明显的区分的(通过*与&)
分享到:
相关推荐
【Java学习日记3】 在Java学习的初期,我们首先要了解Java的基本特性,它是一种跨平台的语言,这得益于Java虚拟机(JVM)。JVM使得Java程序可以在任何支持JVM的操作系统上运行,如Windows、Linux或Mac OS。JVM有多...
此外,《Rust学习日记》还包括了对标准库的使用介绍及第三方库集成指导,为读者提供全面而实用的学习路径。每章节后附有习题练习,便于巩固所学知识并应用于项目开发中。 适用人群: 对Rust感兴趣的初学者,希望...
### C++学习日记 3:变量初始化与基本数据类型详解 #### 变量初始化 在C++编程语言中,变量初始化是一项重要的操作,它确保了变量在被使用之前具有一个明确的初始值。变量初始化有助于避免因使用未初始化的数据而...
【Java进阶学习日记】是一份全面且深入的Java学习资料,旨在帮助已经掌握基础的开发者进一步提升技能,同时也适合正在寻找工作的Java学习者作为面试准备。这份学习笔记涵盖了广泛的Java相关主题,从底层的计算机操作...
"Python学习日记.zip"这个压缩包文件,很可能包含了某位开发者在学习Python时所记录的笔记、代码示例或项目实践,旨在帮助初学者或者有经验的程序员巩固Python的基础,探索其高级特性,以及解决实际问题。...
本文将围绕C8051F的学习日记,探讨其中的关键知识点,尤其是AD采集和中断处理。 首先,C8051F的AD采集功能是其一大亮点。在提供的代码中,可以看到AD采集用于测量交流电的电压和电流,通过精密整流后,每个周期采集...
### jBPM小白的学习日记——深入理解流程定义与部署 #### 一、jBPM简介 jBPM(Java Business Process Model)是一个开源的工作流引擎,由JBoss维护,广泛应用于业务流程管理(BPM)场景。它提供了一种简单而强大的...
Oracle DBA学习日记笔记 本资源为 Oracle DBA 学习日记笔记,共36页,简洁清晰的总结了 Oracle DBA 的重点部分,这是一个非常有价值的 Oracle DBA 入门资料。 在本资源中,我们可以看到作者Stephenzhou对 Oracle ...
【XWiki 学习日记1】 XWiki 是一个开源的、可扩展的、基于Java的wiki平台,它提供了丰富的功能,包括文档管理、协作编辑、版本控制等。在这个学习日记中,我们将深入探讨XWiki的核心特性,源码结构以及如何利用它...
**Python学习日记** 这篇日记包含了对Python编程语言的多个核心概念的详细学习记录,通过一系列的md文件,我们可以深入理解Python的基本语法、数据结构、控制流以及错误处理机制。 1. **字面量、数据类型、输入...
该项目汇集自《Rust学习日记》公众号,旨在帮助读者从零基础小白成长为Rust领域的专家。源码包含568个文件,涵盖168个Rust源文件、121个TOML配置文件、120个LOCK文件、17个PNG图片、16个DS_Store文件、11个...
Linux 210 学习日记是一系列针对S5PV210处理器的学习记录,旨在帮助读者理解并掌握这款基于ARM Cortex-A8架构的微处理器的使用。S5PV210是三星推出的一款高性能应用处理器,常用于嵌入式系统和开发板,如QT210开发板...
这篇学习日记将为你提供一个实用性极强的Oracle学习总结,涵盖了基础使用、常用命令、数据库配置、用户管理和权限管理等多个方面。 首先,了解Oracle数据库的基本使用是学习的基础。这包括了如何连接和断开数据库,...
SpringBoot学习日记(一-六)是一系列关于Spring Boot技术的深入探讨,涵盖了从基础到进阶的应用。Spring Boot是Spring框架的一个简化版,旨在简化Java应用的初始搭建以及开发过程,它内置了Tomcat服务器并默认配置了...
【Linux学习日记(2)_准备工作】这篇日记主要涵盖了在Linux环境下对嵌入式开发板进行初始设置和程序烧录的基本步骤,以及相关的编程实践。以下是详细的解析: 首先,文章介绍了如何将裸机程序下载到SD卡。在Linux...
【标题】:“Android学习日记-2 ASM android底层” 在Android开发中,深入理解系统的底层运作是提升技术能力的重要环节。ASM是一个强大的字节码操控和分析框架,它允许动态生成类或者增强已有类的功能,而无需知道...
这个压缩包"html学习日记6_网站.rar"很可能是某位学习者在第六阶段关于构建网站的学习记录,其中可能包含了HTML代码示例、笔记或者小项目。"pre_html_04"这个文件名可能是指预HTML的第四个部分,暗示了这是一个关于...