String 的不可變類型

對(duì)象的引用問(wèn)題(1)

 @Test
    public void MethodTest() {
        Person person = new Person();
        person.name = "hello";
        show(person);

        System.out.println("-"+person.name);
    }

    public void show(Person person) {
        Person innerPerson = person;
        System.out.println(innerPerson.name);
        innerPerson.name = "賦值";
    }

打印

hello
-賦值

結(jié)論 方法內(nèi) innerPerson 和 person 引用的是同一個(gè)地址空間 , innerPerson的賦值會(huì)對(duì)方法外的對(duì)象造成改變; 由于 innerPerson 是局部對(duì)象 存取速度也會(huì)比成員快;

 如果把變量賦值為final 會(huì)保證他只能賦值一次 , 更安全

對(duì)象的引用問(wèn)題(2)

今天我在學(xué)習(xí)hanler 復(fù)用message sPool的時(shí)候 發(fā)現(xiàn)類型這樣的代碼
next 賦值為null , 不會(huì)造成 sPool 也為null嗎?

        sPool = person.next;//next 是一個(gè)bean對(duì)象
        person.next = null;
        System.out.println(sPool);

打印

com.example.liuyuzhe.kotlindome.ObjectReferenceTest$User@694f9431
結(jié)果是有值的 , 經(jīng)過(guò)分析 , sPool = person.next 他們2個(gè)對(duì)象指向了同一個(gè)內(nèi)存地址空間 , person.next = null; 這句話是把 next 對(duì)象 的引用指向了另一個(gè)(地址空間)對(duì)象 (它是null對(duì)象) ; 你可以用 person.next 來(lái)改變sPool對(duì)象的內(nèi)部結(jié)構(gòu) , 但無(wú)法改他的地址空間

String 設(shè)計(jì)為不可以變類型是為了 安全避免 別名(賦值會(huì)改變: 別名定義在下面)的問(wèn)題

 private boolean mChange = false;
    private boolean tempBoolean = false;


    public void String_isChange() throws Exception {
        new Thread() {
            @Override
            public void run() {
                for (; ; ) {
                    fetchSleep(200);
                    if (isChange()) {
                        varStr = " start change ";
                        tempBoolean = true;
                        System.out.println("start change" + varStr);
                        fetchSleep(5000);
                        break;
                    }
                }
            }

        }.start();
        varStr = "init";
        testVar(varStr);
    }

    private void fetchSleep(int millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 11-05 23:50:34.324 2920-2920/com.example.liuyuzhe.kotlindome I/System.out: tempBoolean start false
       11-05 23:50:34.525 2920-2953/com.example.liuyuzhe.kotlindome I/System.out: start change start change 
       11-05 23:50:37.326 2920-2920/com.example.liuyuzhe.kotlindome I/System.out: tempBoolean end true
       11-05 23:50:37.326 2920-2920/com.example.liuyuzhe.kotlindome I/System.out: fetchSleep after init 
     * @param varStr
     */
    public void testVar(String varStr) {

        mChange = true;

        System.out.println(" fetchSleep before " + varStr);

        System.out.println("tempBoolean start " + tempBoolean);

        fetchSleep(3000);
        //走到這里 tempBoolean 打印為true , 說(shuō)明 varStr的成員變量已經(jīng)改變了,
        // 但是varStr 傳遞進(jìn)來(lái)時(shí)其值已經(jīng)確定了 , 不可變類型 , 成員變量的varStr 和 形參不是一個(gè)對(duì)象;
        System.out.println("tempBoolean end " + tempBoolean);
        System.out.println(" fetchSleep after " + varStr);
    }


    public boolean isChange() {
        return mChange;
    }

什么是別名 : 就是對(duì)象的引用地址 , 會(huì)由一個(gè)對(duì)象的改變 , 導(dǎo)致同一個(gè)引用的對(duì)象發(fā)生改變

public static void main(String[] args) {
// TODO Auto-generated method stub
Tank t1=new Tank();
Tank t2=new Tank();
t1.level=9;
t2.level=47;
System.out.println("t1.level:"+t1.level+"    t2.level:"+t2.level);
t1=t2;
System.out.println("t1.level:"+t1.level+"    t2.level:"+t2.level);
t1.level=27;
System.out.println("t1.level:"+t1.level+"    t2.level:"+t2.level);
}
}
結(jié)果:
t1.level:9    t2.level:47
t1.level:47    t2.level:47
t1.level:27    t2.level:27

String 是不可變類型 , 不存在別名問(wèn)題

        String t1 = "a";
        String t2 = "b";

        System.out.println("初始化 t1="+t1);
        System.out.println("初始化 t2="+t2);

        t2 = t1;

        System.out.println("拉手后 t1="+t1);
        System.out.println("拉手后 t2="+t2);

        t1 = "c";

        System.out.println("改變 t1 后 "+t1);
        System.out.println("改變t1 后 t2的狀態(tài) "+t2);

打印結(jié)果

初始化 t1=a
初始化 t2=b
拉手后 t1=a
拉手后 t2=a
改變 t1 后  c
改變t1 后 t2的狀態(tài)  a 

說(shuō)明 String 的 值對(duì)象 , 不存在別名的問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蠢甲,一起剝皮案震驚了整個(gè)濱河市剿干,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弯洗,老刑警劉巖能真,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赁严,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡粉铐,警方通過(guò)查閱死者的電腦和手機(jī)疼约,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝙泼,“玉大人程剥,你說(shuō)我怎么就攤上這事√捞ぃ” “怎么了织鲸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)茎活。 經(jīng)常有香客問(wèn)我昙沦,道長(zhǎng),這世上最難降的妖魔是什么载荔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任盾饮,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丘损。我一直安慰自己普办,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布徘钥。 她就那樣靜靜地躺著衔蹲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呈础。 梳的紋絲不亂的頭發(fā)上舆驶,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音而钞,去河邊找鬼沙廉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛臼节,可吹牛的內(nèi)容都是我干的撬陵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼网缝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼巨税!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起粉臊,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤草添,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后维费,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體果元,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年犀盟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了而晒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阅畴,死狀恐怖倡怎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贱枣,我是刑警寧澤监署,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站纽哥,受9級(jí)特大地震影響钠乏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜春塌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一晓避、第九天 我趴在偏房一處隱蔽的房頂上張望簇捍。 院中可真熱鬧,春花似錦俏拱、人聲如沸暑塑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)事格。三九已至,卻和暖如春搞隐,著一層夾襖步出監(jiān)牢的瞬間驹愚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工尔许, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留么鹤,地道東北人终娃。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓味廊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親棠耕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子余佛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法窍荧,內(nèi)部類的語(yǔ)法辉巡,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法蕊退,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等郊楣,對(duì)于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,488評(píng)論 0 3
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)瓤荔,斷路器净蚤,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,917評(píng)論 6 13
  • 很多年輕的父母今瀑,心智并沒(méi)有成熟就急急忙忙的結(jié)婚生孩子,可是卻沒(méi)有給孩子一個(gè)良好的成長(zhǎng)環(huán)境点把,這樣的父母真的應(yīng)該少一點(diǎn)...
    書(shū)宸閱讀 328評(píng)論 0 1