<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java函數的參數傳遞和String類型

    Posted on 2009-06-06 09:02 thui 閱讀(2945) 評論(4)  編輯  收藏 所屬分類: java技術

    java的String類型,你徹底理解嗎?看看下面的題目:

    String s=”abc”;

    String s1=”abc”;

    String s2=new String(“abc”);

    String s3=s2.intern();

    System.out.println(s1==s);

    System.out.println(s1==s2);

    System.out.println(s1==s3);

    上面的題目會打印什么?

    如果你不確定,那么請打開Eclipse,敲入上面的程序運行一下,你會發現打印的是true、false、true,為什么會有上面的打印呢?了解了下面關于java String的細節后,就會明白:

    1.雙引號字符串是常量字符串,在java文件編譯的時候就放在虛擬機的常量池中,比如s,當創建abc時,發現常量池中沒有就在常量池中創建abc并把abc的地址賦給s,當再創建s1時,首先會去常量池中去查找abc是否存在,如果存在就把常量池中abc的地址賦給s1,所以比較s和s1的地址是相等的

    2.如果用new的方法創建一個String時,就和s=”abc”不一樣了,s2=new String(“abc”)是在程序運行時創建,不是創建在常量池而是和其他java對象一樣在java堆上創建,因此它的地址和s不用.

    3.如果運行時想把一個String創建到常量池中,java提供了一種方法,這個方法也會先檢查常量池是否存在abc,若存在返回abc在池中的地址。所以最后一個打印時true

    在看下面的題目:

    String s1=”ab”;

    String s2=”cd”;

    String s3=”abcd”;

    String s4=s1+s2;

    String s5=”ab”+"cd”;

    System.out.println(s4==s3);

    System.out.println(s5==s3);

    這是又會是什么結果呢?答案是false,true,這個題目說明兩個字符串常量連接和還是字符串常量,但是只要其中一個是變量,就和new的效果一樣了,即是在堆上創建

    說完了java的String類型,我們最后看看java函數參數的傳遞,到底是值傳遞還是引用傳遞呢?一般的說法是對于基本類型比如int、char是值傳遞,對于對象類型是引用傳遞。這種說法沒錯,但是請看下面的例子

    String s=”abc”;

    change(s);

    System.out.println(s);

    public void change(String str)

    {

      str=”abcd”;

    }

    上面的程序會有什么結果呢?打印abc還是abcd,運行程序會發現打印的是abc,完了,似乎不合乎常理,按理說String 也是對象,應該是引用傳遞才對啊,有的同學知道java的String類型是不可變類型,會得出結果abc,具體解釋是String就相當于是char[]的包裝類。包裝類的特質之一就是在對其值進行操作時會體現出其對應的基本類型的性質。在參數傳遞時,包裝類就是如此體現的。所以,對于String在這種情況下的展現結果的解釋就自然而然得出了。同樣的,Integer、Float等這些包裝類和String在這種情況下的表現是相同的。下面從函數參數傳遞的方式來理解也可以得出相同的結果

    java的參數傳遞本質上都可以認為是值傳遞,對基本類型自然不必說,對于對象類型,傳遞的是對象的地址,地址是個數字,也是基本類型,所以也還是值傳遞的, 有了這個基礎,上面的題目可以這樣理解,s是字符串abc的地址,調用change方法時,把s的拷貝賦給str,即str也指向abc,但是在方法里又把str指向abcd,str就是abcd的地址了,但是s還是指向的abc。

    Feedback

    # re: java函數的參數傳遞和String類型  回復  更多評論   

    2010-11-24 14:04 by 老徐
    什么啊,胡扯嗎不是!

    # re: java函數的參數傳遞和String類型  回復  更多評論   

    2011-03-29 18:20 by happyldp
    樓主牛逼啊!

    # re: java函數的參數傳遞和String類型  回復  更多評論   

    2014-05-07 23:49 by <script>alert("fuck")</script&g
    還不錯 學習學習

    # re: java函數的參數傳遞和String類型  回復  更多評論   

    2015-09-29 12:54 by lzyer
    class Person{

    private Integer id;
    private String name;
    public Integer getId() {
    return id;
    }
    public void setId(Integer id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }

    }
    public class StringTest {

    public void changeString(String s){

    s = "asds";
    }
    public void changeInteger(Integer i){

    i+=2;
    }
    public void changePerson(Person p){
    Person a = p;
    a.setId(2);

    }
    public static void main(String[] args) {

    StringTest st = new StringTest();
    Person p = new Person();
    p.setId(1);
    p.setName("hello");
    st.changePerson(p);
    System.out.println(p.getId()+" : "+p.getName());
    }
    }
    結果為:2 : hello
    怎么解釋???

    posts - 11, comments - 8, trackbacks - 0, articles - 4

    Copyright © thui

    主站蜘蛛池模板: 亚洲精选在线观看| 亚洲第一区二区快射影院| 国产亚洲人成网站观看| 亚洲av永久无码精品天堂久久| 亚洲A∨精品一区二区三区下载| aa级毛片毛片免费观看久| 和日本免费不卡在线v| 国产亚洲老熟女视频| 亚洲AV成人影视在线观看| 99久久这里只精品国产免费| 亚洲综合最新无码专区| 亚洲欧美精品午睡沙发| 99国产精品免费视频观看| 久久亚洲AV永久无码精品| 成人一区二区免费视频| 免费一级国产生活片| 波多野结衣亚洲一级| 久久久久久精品成人免费图片| 亚洲午夜久久久久妓女影院 | 日韩免费高清视频| 亚洲欧洲一区二区| 日日麻批免费40分钟日本的| 亚洲av永久无码精品漫画| www免费插插视频| 免费在线观看黄网站| 国内永久免费crm系统z在线| 亚洲中文字幕在线观看| 无遮挡国产高潮视频免费观看| 午夜影视在线免费观看| 亚洲六月丁香婷婷综合| 日本v片免费一区二区三区| 国产免费牲交视频免费播放| 久久亚洲AV无码精品色午夜麻豆| 国产成人AV免费观看| 亚洲mv国产精品mv日本mv| 免费人成在线观看播放国产| 毛片在线全部免费观看| 亚洲AV永久精品爱情岛论坛| 亚洲成在人线aⅴ免费毛片| 日本免费精品一区二区三区| 国产一级淫片免费播放|