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;

原文地址:https://www.cnblogs.com/z2qfei/p/7998132.html