java 函数传递引用_java中函数是值传递还是引用传递

1. 参数为基础数据类型时

public static void main(String[] args) {

int a=5;

changeA(a);

System.out.println("after changeB a: "+a);

System.out.println("----------------------");

Integer b=new Integer(5);

changeB(b);

System.out.println("after changeB b: "+b);

}

static void changeA(int a){

a=100;

System.out.println("in changeA a: "+a);

}

static void changeB(Integer b){

b=100;

System.out.println("in changeB b: "+b);

}

//log

in changeA a: 100

after changeB a: 5

----------------------

in changeB b: 100

after changeB b: 5

函数参数相当于函数内部局部变量,当参数为基础数据类型时,为内部局部变量赋值,所以内外变量本质上并不是同一个变量,只是数值相同。

2. 参数为对象类型时

/**

* 功能:验证Java中函数是值传递还是引用传递

*/

public class ParameterPassingText {

static class Cat {

public String name;

public Cat(String name) {

this.name = name;

}

@Override

public String toString() {

return super.toString() + name;

}

}

public static void main(String[] args) {

Cat cat = new Cat("白猫");

System.out.println("before change0: "+cat.toString());

change0(cat);

System.out.println("after change0: "+cat.toString());

System.out.println("======================================================================");

cat = new Cat("白猫");

System.out.println("before change1: "+cat.toString());

change1(cat);

System.out.println("after change1: "+cat.toString());

}

private static void change0(Cat cat) {

cat.name = "黑猫";

System.out.println("on change0: "+cat.toString());

}

private static void change1(Cat cat) {

cat=new Cat("黑猫");

System.out.println("on change1: "+cat.toString());

}

}

打印的Log如下:

before change0: base_knowledge.ParameterPassingText$Cat@7ea987ac白猫

on change0: base_knowledge.ParameterPassingText$Cat@7ea987ac黑猫

after change0: base_knowledge.ParameterPassingText$Cat@7ea987ac黑猫

======================================================================

before change1: base_knowledge.ParameterPassingText$Cat@12a3a380白猫

on change1: base_knowledge.ParameterPassingText$Cat@29453f44黑猫

after change1: base_knowledge.ParameterPassingText$Cat@12a3a380白猫

其实,函数的参数相当于函数内部的局部变量

2.1 change0分析

3f69b11755a6

change0分析

外部引用cat指向地址为7ea987ac的对象。当把外部cat作为参数传入change0时,外部cat指向的地址会被赋值给函数的局部引用cat,所以内外两个cat指向同一地址,即同一对象。change0内改变内部cat的属性本质上也是改变地址为7ea987ac的Cat对象的属性,所以会影响外部cat的属性。

2.2 change1分析

3f69b11755a6

change1分析

把外部cat作为参数传入change1时,主要分成两个步骤:

外部cat指向的地址会被赋值给函数的局部引用cat

局部引用cat重新赋值,指向地址为29453f44的另一个Cat对象

所以,在change1内部局部引用cat指向的对象和外部cat并不指向同一对象

综上所述,可以总结为:

函数的参数相当于函数内部的局部变量

引用参数传递时,会先把 外部引用指向的地址 赋值给 函数内部的局部变量指向的地址,即外部传值给这个参数实际上就是改变这个参数所指向的内存地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值