java中调用方法传值问题详解

Posted 我想月薪过万

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中调用方法传值问题详解相关的知识,希望对你有一定的参考价值。

背景

最近,我在用java写代码过程中遇到了这么个情况:通过调用 方法 来修改 值,有时候能成功,有时候却失败,让我百思不得其解。于是,这篇博文诞生了,与大家一起分享一下我的使用心得。

基础知识

想要搞清楚这个问题之前,我们得清楚的明白: 在 java 中有哪些数据类型。

  • java中的数据类型,分为两类:基本数据类型引用数据类型

  • 基本数据类型:

基本数据类型
整数类型int、long、short、byte
浮点类型float、double
字符类型char
布尔类型boolean
 数据类型大小/字节可表示数据范围默认值
1byte(字节型)1-128~1270
2short(短整型)2-32768~327670
3int(整型)4-2147483648~21474836470
4long(长整型)8-9223372036854775808~92233720368547758070
5float(单精度)4-3.4E38~3.4E380.0
6double(双精度)8-1.7E308~1.7E3080.0
7char(字符)20~255'\\u0000'
8boolean(布尔)-true或falsefalse

 

  • 引用数据类型:非基本数据类型的都是引用数据类型,你把基本数据类型记熟就好了。例如:String类型

除了弄清楚数据类型外,你还得大致了解他们在内存中是如何存储的。

  • 基本数据类型的存储:在方法中定义的非全局基本数据类型变量的具体内容是存储在中的

  • 引用数据类型的存储:只要是引用数据类型变量,其具体内容都是存放在中的,而中存放的是其具体内容所在内存的地址

代码演练

有了上面的基础知识储备,我们来讲三个代码示例,帮助大家理解 在 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 类等

 

有偿提问

如果大家觉得这篇文章帮助你了,可以支持一下。

有偿提问

以上是关于java中调用方法传值问题详解的主要内容,如果未能解决你的问题,请参考以下文章

Java线程池详解

java线程传值的问题

java中的值传递和引用传递用法详解

java中方法传值小知识解析

跨域访问方法介绍--使用片段识别符传值

Java方法中传值和引用传递的问题(转)