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 类等

 

有偿提问

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

有偿提问

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

super码王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值