图解JAVA参数传递
今天做项目,发现了一个问题,当String作为参数传递的时候,在函数内部改变值对外部的变量值无影响,如下代码:
public static void main(String[] args) {
String str = "11111";
changeStr(str);
System.out.println(str);//输出11111
}
public static void changeStr(String str){
str = "22222";
}
一开始很不解,后来想明白了,遂去对java参数传递做一个总结,以加深自己的基础知识.
1.基本类型传递
对于:
- 整型: byte short int long
- 浮点型 float double
- 逻辑型 boolean
- 字符型 char
四类八种基本类型来说,传递的都是值,因为这些值是直接保存在栈内存中的,所以传递的时候直接拷贝过去了.
public static void main(String[] args) {
int num = 0;
change(num);
System.out.println(num);//输出0
}
public static void change(int numChange){
numChange =5;
}
结构如下图,也因此最外层的num的值并没有受到影响.

2.对象传递
2.1 例一
对象传递,本质上也都是值传递,只不过传递的值是该引用的拷贝.看下面实例和图解:
public static void main(String[] args) {
Person person = new Person("aaa", 11);
change(person);
System.out.println(person);//输出 bbb 11
}
public static void change(Person personChange){
personChange.setName("bbb");
}
结构图如下:
当执行change的时候,会把person变量的指向的地址拷贝一份给personChange,两者都指向同一个堆内存,即使后面做了set方法修改,但是对两者的执行毫无影响.

2.2例二
例二和之前的不同之处在change里面,对personChange进行了new操作.代码如下:
public static void main(String[] args) {
Person person = new Person("aaa", 11);
change(person);
System.out.println(person);//输出 aaa 11
}
public static void change(Person personChange){
personChange = new Person("bbb",12);
}
结构图如下:

当执行change的时候,会把person变量的指向的地址拷贝一份给personChange,两者都指向同一个堆内存,接下new操作会在堆中重新创建一个person对象,此时personChange则指向这个对象,而原person的指向没发生变化,故输出aaa 11.
2.3 例三
例三是综合例一和例二,前面两个搞懂的话这个就很容易懂了.
public static void main(String[] args) {
Person person = new Person("aaa", 11);
change(person);
System.out.println(person);//输出 ccc 11
}
public static void change(Person personChange){
personChange.setName("ccc");
personChange = new Person("bbb",12);
}
结构图如下:

读者自己理解下,不懂的话再看看前面的,看看为什么输出CCC 11
2.4特殊的String
终于到最初的问题,为什么String是对象,但是却不符合上面对象传递测试出来的结果?
public static void main(String[] args) {
String str = "11111";
changeStr(str);
System.out.println(str);//输出11111
}
public static void changeStr(String str){
str = "22222";
}
原因:
因为String对象具有不可变性,所以针对操作str = "22222",在String池中不存在的时候,就是相当于str = new String(),这样变化下的话,那么就和例一 一模一样了,具体图就不画了,希望对你有帮助.
ps:如果想改变的话,可以使用Holder包装类包装String,可以参考博文:Java基础系列18:Holder技术的实现原理分析 | zifangsky的个人博客
3.总结
要理解上面的结果,就要认为Java中只有值传递:
- 对于基本类型,直接拷贝值传递过去
- 对于对象,拷贝当前对象的引用地址,然后把该地址传递过去,所以也是值传递.
图解JAVA参数传递的更多相关文章
- JAVA学习笔记之图解JAVA参数传递
今天做项目,发现了一个问题,当String作为参数传递的时候,在函数内部改变值对外部的变量值无影响,如下代码: public static void main(String[] args) { Str ...
- 图解 Java IO : 二、FilenameFilter源码
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- Java 参数传递都是值传递
Java 参数传递都是值传递,验证代码如下 public class ParamTransferTest { public static void swap(int a, int b) { int t ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- 图解 Java 内存模型
图解 Java 内存模型 (图片来自于:http://www.cnblogs.com/zhangs1986/p/7903722.html)
- [温故]图解java多线程设计模式(一)
去年看完的<图解java多线程设计模式>,可惜当时没做笔记,导致后来忘了许多东西,打算再温习下这本书,顺便在这里记录一下~ 1.顺序执行.并行.并发 顺序执行:多个操作按照顺序依次执行. ...
- 【转载】图解Java常用数据结构(一)
图解Java常用数据结构(一) 作者:大道方圆 原文:https://www.cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, 系统化看了下Jav ...
- 图解java面试
图解Java面试题:基本语法 2017-02-07 14:34 出处:清屏网 人气:178 评论(0) 内容大纲.png &和&&的区别 &和&&的 ...
- 图解Java继承内存分配
图解Java继承内存分配 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法. (3)子 ...
随机推荐
- 2154 杭电 数学规律 ACM
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2154 很简单的找规律的数学题目: 思路:因为挑完N次后都要跳回A,所以相当于挑N-1次后必须留在B C区域 ...
- Git在eclipse中的使用,克隆导入eclipse项目
一 Eclipse 安装EGit 1)安装 Eclipse Juno 版后已经集成了EGit,可以通过如下地址安装:http://download.eclipse.org/egit/upda ...
- 数模转换ADC08009应用
#include <reg52.h> //头文件 #define uchar unsigned char //宏定义无符号字符型 #define uint unsigned int //宏 ...
- nodejs,mongodb不同时区问题
问题:不同国家,使用不同时区,而服务器代码却在国内,跨时区日期不同,根据日期查询,查询不到数据了 1.mongodb存储的new Date()是UTC时间,也就是0时区的时间,世界标准时间 2.参考m ...
- C语言基础一(敲打键盘、寻找资料)
事前声明一点:小编的所有材料都是基础,没有什么大的不同,您若觉得不错的话,可以互相探讨下,毕竟本人也是小雏鸟. 大家在学习C语言.C++类似的高端语言时候,往往都是为了学而学,殊不知为什么而学,或许更 ...
- Python中join 和 split详解(推荐)
http://www.jb51.net/article/87700.htm python join 和 split方法简单的说是:join用来连接字符串,split恰好相反,拆分字符串的. .join ...
- Python爱好者社区历史文章列表(每周append更新一次)
2月22日更新: 0.Python从零开始系列连载: Python从零开始系列连载(1)——安装环境 Python从零开始系列连载(2)——jupyter的常用操作 Python从零开始系列连载( ...
- BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方 ...
- R语言语法基础二
R语言语法基础二 重塑数据 增加行和列 # 创建向量 city = c("Tampa","Seattle","Hartford"," ...
- 唐平中讲座笔记 Reinforcement mechanism design 20171107
渣排版预警,纯草稿... 唐平中.研究方向是经济学和ai方向,机制设计和拍卖设计. 内容:广告优化的方法论,自动优化. [内容] Basics on mechanism design and resr ...