图解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)子 ...
随机推荐
- It is not safe to rely on the system's timezone settings错误
在写php程序中有时会出现这样的警告: PHP Warning: date(): It is not safe to rely on the system's timezone settings. Y ...
- JavaScript踩坑
1 //这样做会抛出错误 alert(ttt); //这样做不会,只是会弹出undefine而已 alert(window.ttt); 当然可以try catch如此捕获异常 try { //这样做会 ...
- BZOJ3252攻略——长链剖分+贪心
题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...
- 3ds max学习笔记(一)--选择物体
选择所有物体:编辑-->全选(快捷:ctrl+a),在其他空白地方点击则取消选择(或编辑-->选择不选)反选:选择一部分物体 --编辑--反选/ ctrl+i 快速反选加选物体:选择一部分 ...
- js获取浏览器屏幕的尺寸
浏览器屏幕尺寸参照表: 如何获取屏幕宽度: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: ...
- Map不同具体实现类的比较和应用场景的分析
1.Map的概括总结 (01) Map 是“键值对”映射的抽象接口.(02) AbstractMap 实现了Map中的绝大部分函数接口.它减少了“Map的实现类”的重复编码.(03) SortedMa ...
- 1. cs231n k近邻和线性分类器 Image Classification
第一节课大部分都是废话.第二节课的前面也都是废话. First classifier: Nearest Neighbor Classifier 在一定时间,我记住了输入的所有的图片.在再次输入一个图片 ...
- python正则表达式里引入变量
import re def reg_exp(senten): jiqiren = "阿童木" matchObj1 = re.search( r'(你(.*?)(男|女))|(机器( ...
- Wordpress添加分类
网址一般不用中文,别名方便让网址更美观,如: xxx/category/new/
- TensorFlow相关
TensorFlow的55个经典案例(转) https://blog.csdn.net/xzy_thu/article/details/76220654 随笔分类 - 数据挖掘及机器学习 www.c ...