java形参改变实参_java方法改变形参后得到实参值是否改变

public voidtest1(){

String s= "1";

System.out.println("调用方法hange1前s的内存地址:"+System.identityHashCode(s));

Integer i= 1;

System.out.println("调用方法change1前:"+s+"-----"+i);

change1(s, i);

System.out.println("调用方法change1后s的内存地址:"+System.identityHashCode(s));

System.out.println("调用change1方法后:"+s+"-----"+i);

String[] arr= {"1","2"};

System.out.println("调用方法hange2前arr的内存地址:"+System.identityHashCode(arr));

System.out.println("调用change2方法前:"+arr[1]);

change2(arr);

System.out.println("调用方法hange2后arr的内存地址:"+System.identityHashCode(arr));

System.out.println("调用change2方法后:"+arr[1]);

}private voidchange1(String s, Integer i){

String str= "1";

System.out.println("新定义str(与未改变的s相同):"+System.identityHashCode(str));

s= "2";

System.out.println("方法里改变s后内存地址:"+System.identityHashCode(s));

i= 2;

}private voidchange2(String[] arr){

arr[1] = "lll";

System.out.println("方法hange2的arr的内存地址:"+System.identityHashCode(arr));

}

//结果

bf73168af99937502d04135b436b7489.png

如图:方法中形参的“s”(String类型)改变后地址发生了变化,只是形参的“s”(这里也可以随便起个名称如“s1”,“s2”)地址发生了改变,主方法实参“s”地址一直是原地址

故:在方法中形参地址改变不会影响到实参地址;

基本类型和String值改变是会改变对应的地址,但主方法“s”和“i”指向地址一直未变;故不会发生改变

**** 注意:因为Integer和String都是final修饰,改变值后会指向新的地址;

arr是引用类型在方法change2中修改后。方法中的形参“arr”和主方法中的实参“arr”指向的还是同一个地址,故改变后主方法实参“arr”指向地址的值发生改变,实参“arr”发生改变;

故:引用类型的形参的引用地址与实参一样时,形参改变会影响到实参(非String和基本类型)

举例:如果change2的方法中写的是 arr = new String[]{};

也就是

private voidchange2(String[] arr){//arr[1] = "lll";

arr = new String[]{"222", "333"};

System.out.println("方法hange2的arr的内存地址:"+System.identityHashCode(arr));

}

结果(在主方法中arr未改变):

912071219a655f369b771147681d392b.png

在change2中arr = new String[]{"222", "333"};相当于给方法中的形参“arr”指向了一个新的地址(此时change2中的“arr”和主方法中的“arr”指向地址已经不同),此时形参“arr”改变已经影响不到实参“arr”;

因此又证明了:在方法中形参地址改变不会影响到实参地址;

举例:如下面代码:

public classTestPerson {public static voidmain(String[] args) {

Person p1= new Person("张无忌");

Person p2= new Person("赵敏");

System.out.println("p1原值:"+p1);

System.out.println("p2原值:"+p2);

System.out.println("p1内存地址:"+System.identityHashCode(p1));

System.out.println("p2内存地址:"+System.identityHashCode(p2));

change3(p1, p2);

System.out.println();

System.out.println("调用change3之后p1值:"+p1);

System.out.println("调用change3之后p2值:"+p2);

System.out.println("调用change3之后p1内存地址:"+System.identityHashCode(p1));

System.out.println("调用change3之后p2内存地址:"+System.identityHashCode(p2));

}public static voidchange3(Person x, Person y){

Person temp=x;

x=y;

y=temp;

System.out.println();

System.out.println("change3方法中交换后(之前x=p1;现在x=p2)x="+x);

System.out.println("change3方法中交换后(之前y=p2)y="+y);

System.out.println("change3方法中交换后(之前x=p1;现在x=p2)x内存地址:"+System.identityHashCode(x));

System.out.println("change3方法中交换后(之前y=p2)y内存地址:"+System.identityHashCode(y));

}

}classPerson{publicString name;publicPerson(String name) {this.name =name;

}

@OverridepublicString toString() {return "Person [name=" + name + "]";

}

}

在change3中只不过是让x和y的引用地址发生了改变;但不会影响到原有的p1和p2指向的地址

b9c6e89c5741d490c3879c72fe901e83.png

开始p1和x指向同一个地址,p2和y指向同一个地址,在方法未交换之前实参和形参的地址(即p1->17984913、x->17984913、p2->14116828、y->14116828),调用方法后因为x和y互换(即p1->17984913、x->14116828、p2->14116828、y->17984913)p1和p2不变,x和y地址互换,之后没发生具体值的改变,且p1和y指向同一个地址,p2和x指向对一个地址,故p1和p2不会发生变化;

举例:p1发生变化

public static voidchange3(Person x, Person y){

Person temp=x;

x=y;

y=temp;

y.name="张三";

System.out.println();

System.out.println("change3方法中交换后(之前x=p1;现在x=p2)x="+x);

System.out.println("change3方法中交换后(之前y=p2)y="+y);

System.out.println("change3方法中交换后(之前x=p1;现在x=p2)x内存地址:"+System.identityHashCode(x));

System.out.println("change3方法中交换后(之前y=p2)y内存地址:"+System.identityHashCode(y));

}

//结果

ae44a41eab8bb109d0c984be224b04c4.png

在方法中交换之后p1个y指向同一个地址 如上图y和p1内存地址为8600110;故地址相同,修改y.name = "张三"; (即地址8600110的内容改变),因为p1也是指向8600110所以p1也会发生变化;

故:当形参的引用地址与实参一样时,形参改变会影响到实参(非String和基本类型)

.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值