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));
}
//结果
如图:⽅法中形参的“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未改变):
在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;
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指向的地址
开始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不会发⽣变化;
java的tostring方法举例: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));
}
在⽅法中交换之后p1个y指向同⼀个地址 如上图y和p1内存地址为8600110;故地址相同,修改y.name = "张三"; (即地址8600110的内容改变),因为p1也是指向8600110所以p1也会发⽣变化;
故:当形参的引⽤地址与实参⼀样时,形参改变会影响到实参(⾮String和基本类型)
.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论