String 是什么类型?基本类型,引用类型?

String 是什么类型?基本类型,引用类型?

String 是引用类型,参数传递是引用传递,但参数改变,并不影响原地址所指向的值发生变化,因为参数改变,只是改变了引用,并没有改变传递进来的引用所指向的值。

转载

首先是String。

1

String s = "aaa";

这里,jvm创建一个变量引用s,在堆中创建一个对象aaa,将aaa放进常量池。s指向aaa。

然后就到了change方法里。这里这样理解:将s引用的一个拷贝传给方法change。这样change有一个变量s,这个s也是指向aaa的。那么我们来通过debug来看后来发生了什么。

1.s指向aaa的时候:

2.s运行到change方法里的时候

然后看s再次赋值的时候:

然后我们运行结束change方法后到主方法里:

到这里s就结束了。那么如果我们按照传递的是s这个变量的引用,即String s="aaa"中这个s本身,那么,s这个本身是个变量,s指向aaa,在方法change里s又指向了123,回到主方法后s变量的指向被改变了?错!显然s仍旧是aaa,那么只能这样理解:s传递到方法里的时候,复制了s指向的地址给change,change里的s是另一个s,s指向aaa(@718),然后在change中s又指向了123(@731),由于String是不可变类(final and Immutable),这里只是把副本s的指向修改成731,原地址718里的对象没有发生改变因为String不可变。那么,回到主方法的时候,s变量本身没有任何改变,s仍旧指向地址718,718的内容是aaa。所以最终打印aaa。

@Test

public void testString(){

String xx = "abc";

testStr(xx);

System.out.println("xx=" + xx); //xx=abc

}

public void testStr(String args){ System.out.println("args= " +args); //args= abc

String zz = args;

zz = "ghi";

System.out.println("zz= " +zz); //zz= ghi

args = "wwww";

System.out.println("args2= " +args); //args2= wwww

}

由上总结:String是引用数据类型,传参数的时候,是引用传递,也就是传给参数的是引用,也就是地址,参数拿到引用后,就指向了该引用在堆中所存的常量,如果此时改变参数args的值,参数会指向另外的常量地址,调用方法传递进来的那个变量xx引用不变,值不变,

1 String yy = new String("abc"); // 此时yy指向地址@855

2 yy = "def"; //此时指向地址@857

3 testStr(yy);

4 System.out.println("yy=" + yy); //yy=def

5

6

7 public void testStr(String args){

8 System.out.println("args= " +args); //args= def

9 String zz = args;

10 zz = "ghi";

11 System.out.println("zz= " +zz); //zz= ghi

12 args = "wwww";

13 System.out.println("args2= " +args); //args2= wwww

14 }

由上总结:yy首先指向堆中855地址,这个地址里面存储了abc,当改变yy的值为def 时,yy指向地址变了,变成了857, 而不是改变了堆中地址855所存的值;如果在第2行改为:yy="abc", yy的引用不会发生变化还是855;

🎀 相关推荐

圈地自萌意思
365bet网上足球

圈地自萌意思

📅 11-14 👀 965
椁字组词
365手机版游戏中心官网

椁字组词

📅 01-24 👀 2466
短信字符计数器
365bet官方投注网址

短信字符计数器

📅 01-21 👀 7396