zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    OpenERP Framework API存档
    OpenERP 7 picking order 继承需要注意的地方
    Unity战斗系统之AI自主决策
    简易2D横版RPG游戏制作
    UGUI之Canvas Group
    UGUI之Canvas和EventSystem
    NGUI之scroll view的制作和踩坑总结
    NGUI之Toggle实现单选框
    Unity中对象池的使用
    继承MonoBehaviour类的优缺点和相关报错
  • 原文地址:https://www.cnblogs.com/z2qfei/p/7998132.html
Copyright © 2011-2022 走看看