14.Java 基础 - 参数传递

基本概念

在Java 中,参数传递机制有两种:传值、传址。

  • 基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的;属于传值。

  • 对象作为参数传递,是把对象在内存中的地址拷贝了一份传给了参数;属于传址。


实例探究

1.基本类型作为参数传递

public static void main(String[] args) {
    int n =3; // ①

    System.out.println(n); // 3

    chageData(n); // ②

    System.out.println(n); // 3
}

public static void chageData(int num){
        num = 10; // ③
}

观察输出结果,发现 n 的值并没有改变。

因为 n,num 都是基本类型,所以值就直接保存在变量中。

流程图如下(对应代码中的①②③):

这里写图片描述


2.对象作为参数传递

首先来看 String 的例子:

public static void main(String[] args) {
    String str = "hello"; // ①
    System.out.println(str); // hello

    chageData(str); //②

    System.out.println(str); // hello
}

public static void chageData(String s){
    s ="world"; // ③
}

观察结果,发现 str 并没有发生改变。这里结合流程图来做下分析:

  • 在 ① 执行完后,就会在堆中生成一个对象引用 str,里面存放的是地址索引,该地址指向内存中真正的 String 对象

  • 在 ② 生成了对象引用 s ,通过传址引用,它也得到了 “hello” 的地址索引。

  • 在 ③ 对对象引用 s 重新赋值。按理说应该是对象的值从 “hello” -> “world”。但是它却创建了一个的新的对象,原因就在于 String 的不可变性,因为一旦 String 发生变化就创建新的对象。

这里写图片描述


再来看 StringBuffer 的例子:

public static void main(String[] args) {
    StringBuffer stb = new StringBuffer("hello"); // ①
    System.out.println(stb); // hello

    chageData(stb); // ②

    System.out.println(stb); // hello world
}

public static void chageData(StringBuffer s){
    s.append("world"); // ③
}
}

观察结果,发现 stb 发生了改变,因为 StringBuffer 对象是可变的,改变它的内容不会创建出新的对象

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

oxf

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

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

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

打赏作者

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

抵扣说明:

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

余额充值