赞
踩
最近,我在用java写代码过程中遇到了这么个情况:通过调用 方法 来修改 值,有时候能成功,有时候却失败,让我百思不得其解。于是,这篇博文诞生了,与大家一起分享一下我的使用心得。
想要搞清楚这个问题之前,我们得清楚的明白: 在 java 中有哪些数据类型。
java中的数据类型,分为两类:基本数据类型和引用数据类型
基本数据类型:
整数类型 | int、long、short、byte |
---|---|
浮点类型 | float、double |
字符类型 | char |
布尔类型 | boolean |
数据类型 | 大小/字节 | 可表示数据范围 | 默认值 | |
1 | byte (字节型) | 1 | -128~127 | 0 |
2 | short (短整型) | 2 | -32768~32767 | 0 |
3 | int (整型) | 4 | -2147483648~2147483647 | 0 |
4 | long (长整型) | 8 | -9223372036854775808~9223372036854775807 | 0 |
5 | float (单精度) | 4 | -3.4E38~3.4E38 | 0.0 |
6 | double (双精度) | 8 | -1.7E308~1.7E308 | 0.0 |
7 | char (字符) | 2 | 0~255 | '\u0000' |
8 | boolean (布尔) | - | true或false | false |
除了弄清楚数据类型外,你还得大致了解他们在内存中是如何存储的。
有了上面的基础知识储备,我们来讲三个代码示例,帮助大家理解 在 java 中 参数是如何传递的。
第一种:传 基本数据类型
- package test;
-
- /**
- * ClassName: changeData <br/>
- * Description: 调用方法 传递的是基本数据类型 能改变其值吗?
- * date: 2021/5/6 16:16<br/>
- *
- * @author yiqi<br />
- * @since JDK 1.8
- */
- public class changeData {
-
- public static void main(String[] args) {
- int a = 10;
- System.out.println("改变前的a ->" + a);
- changeA(a);
- System.out.println("改变后的a ->" + a);
- }
-
- private static void changeA(int temp) {
- temp = 12;
- }
- }

结果证明:调用方法,传入 基本数据类型 变量的值 ,原始值没变
原因分析:因为 基本数据类型 作为方法参数 传递给方法 是 一种值拷贝,你改变的是他的兄弟,不是他自身。
图解分析:
第二种:传 引入数据类型
- package test;
-
- /**
- * ClassName: changeData <br/>
- * Description: 调用方法 传递的是引用数据类型 能改变其值吗?
- * date: 2021/5/6 16:16<br/>
- *
- * @author yiqi<br />
- * @since JDK 1.8
- */
- public class changeData {
-
- public static void main(String[] args) {
- person p = new person();
- System.out.println("改变前的age ->" + p.age);
- changeA(p);
- System.out.println("改变后的age ->" + p.age);
- }
-
- private static void changeA(person temp) {
- temp.age = 12;
- }
- }
-
- class person{
- int age = 10;
- }

结果证明:调用方法,传入 引用数据类型 变量的值 ,原始值变了
原因分析:因为 引用数据类型 作为方法参数 传递给方法 是 一种地址(引用)拷贝,你改变了这个地址对应的值,就是改变了他自身。
图解分析:
第三种:传 String 引用类型
- package test;
-
- /**
- * ClassName: changeData <br/>
- * Description: 调用方法 传递的是引用数据类型 能改变其值吗?
- * date: 2021/5/6 16:16<br/>
- *
- * @author yiqi<br />
- * @since JDK 1.8
- */
- public class changeData {
-
- public static void main(String[] args) {
- String a = "yiqi";
- System.out.println("改变之前a的值 ->" + a);
- changeA(a);
- System.out.println("改变之后a的值 ->" + a);
- }
-
- private static void changeA(String temp) {
- //这两种方法效果都是一样的,都是改变不了原型值,
- //区别就在于:
- //temp = "yiqi is changed"; 这句话 是对常量的一个操作,内容值存储在类的常量池,在编译期间完成内存分配
- //temp = new String("yiqi is changed"); 这句话 才是真的创建了一个新的 String 对象,在运行期间完成
- // temp = "yiqi is changed";
- temp = new String("yiqi is changed");
- System.out.println("temp的值 ->" + temp);
- }
- }

结果证明:调用方法,传入 String 引用数据类型(包装类) 变量的值 ,原始值没变
原因分析:你可以仔细看看代码,我们在 changeA() 方法里有创建了一个 String 对象给了 temp;相当于改变的是temp的地址值,而改变的并非是其地址对应的值
图解分析:
总结:这里得提醒大家的是第二种和第三种传参和对参数的处理是有区别的。在方法中一个引用指向了一个新的对象(引用),相当于改变了其地址值,只在方法中生效,出了方法,原来的引用内容是怎么样还是怎么样。
与String类似的还有 Integer 类等
如果大家觉得这篇文章帮助你了,可以支持一下。
有偿提问
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。