java中调用方法传值问题详解 | 您所在的位置:网站首页 › get方法调用传递查询数据的函数 › java中调用方法传值问题详解 |
背景
最近,我在用java写代码过程中遇到了这么个情况:通过调用 方法 来修改 值,有时候能成功,有时候却失败,让我百思不得其解。于是,这篇博文诞生了,与大家一起分享一下我的使用心得。 基础知识想要搞清楚这个问题之前,我们得清楚的明白: 在 java 中有哪些数据类型。 java中的数据类型,分为两类:基本数据类型和引用数据类型 基本数据类型: 基本数据类型 整数类型int、long、short、byte浮点类型float、double字符类型char布尔类型boolean 数据类型大小/字节可表示数据范围默认值1byte(字节型)1-128~12702short(短整型)2-32768~3276703int(整型)4-2147483648~214748364704long(长整型)8-9223372036854775808~922337203685477580705float(单精度)4-3.4E38~3.4E380.06double(双精度)8-1.7E308~1.7E3080.07char(字符)20~255'\u0000'8boolean(布尔)-true或falsefalse引用数据类型:非基本数据类型的都是引用数据类型,你把基本数据类型记熟就好了。例如:String类型 除了弄清楚数据类型外,你还得大致了解他们在内存中是如何存储的。 基本数据类型的存储:在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的有了上面的基础知识储备,我们来讲三个代码示例,帮助大家理解 在 java 中 参数是如何传递的。 第一种:传 基本数据类型 package test; /** * ClassName: changeData * Description: 调用方法 传递的是基本数据类型 能改变其值吗? * date: 2021/5/6 16:16 * * @author yiqi * @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 * Description: 调用方法 传递的是引用数据类型 能改变其值吗? * date: 2021/5/6 16:16 * * @author yiqi * @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 * Description: 调用方法 传递的是引用数据类型 能改变其值吗? * date: 2021/5/6 16:16 * * @author yiqi * @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 2018-2019 实验室设备网 版权所有 |