Java對(duì)象的深復(fù)制和淺復(fù)制

來(lái)源:陶邦仁
鏈接:http://my.oschina.net/xianggao/blog/394295?fromerr=5xMat4v4

我們?cè)诰幋a過程經(jīng)常會(huì)碰到將一個(gè)對(duì)象傳遞給另一個(gè)對(duì)象节槐,java中對(duì)于基本型變量采用的是值傳遞酒唉,而對(duì)于對(duì)象比如bean傳遞時(shí)采用的引用傳遞也就是地址傳遞旱眯,而很多時(shí)候?qū)τ趯?duì)象傳遞我們也希望能夠象值傳遞一樣喂链,使得傳遞之前和之后有不同的內(nèi)存地址,在這種情況下我們一般采用以下兩種情況策肝。

淺復(fù)制與深復(fù)制概念

淺復(fù)制(淺克赂睾础) :被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,而所有的對(duì)其他對(duì)象的引用仍然指向原來(lái)的對(duì)象之众。換言之拙毫,淺復(fù)制僅僅復(fù)制所考慮的對(duì)象,而不復(fù)制它所引用的對(duì)象棺禾。

深復(fù)制(深克绿裢怠) :被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,除去那些引用其他對(duì)象的變量帘睦。那些引用其他對(duì)象的變量將指向被復(fù)制過的新對(duì)象袍患,而不再是原有的那些被引用的對(duì)象。換言之竣付,深復(fù)制把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍诡延。

Java的clone()方法

(1)clone方法將對(duì)象復(fù)制了一份并返回給調(diào)用者。一般而言古胆,clone()方法滿足: ①對(duì)任何的對(duì)象x肆良,都有x.clone() !=x//克隆對(duì)象與原對(duì)象不是同一個(gè)對(duì)象筛璧; ②對(duì)任何的對(duì)象x,都有x.clone().getClass()= =x.getClass()//克隆對(duì)象與原對(duì)象的類型一樣 惹恃; ③如果對(duì)象x的equals()方法定義恰當(dāng)夭谤,那么x.clone().equals(x)應(yīng)該成立;

(2)Java中對(duì)象的克挛撞凇: ①為了獲取對(duì)象的一份拷貝朗儒,我們可以利用Object類的clone()方法。 ②在派生類中覆蓋基類的clone()方法参淹,并聲明為public醉锄。 ③在派生類的clone()方法中,調(diào)用super.clone()浙值。 ④在派生類中實(shí)現(xiàn)Cloneable接口恳不。

package com.king.cloneable;

/**
 * 淺復(fù)制
 */
public class ShallowStudent implements Cloneable {
    private String name;

    private int age;

    ShallowStudent(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Object clone() {
        ShallowStudent o = null;
        try {
            // Object中的clone()識(shí)別出你要復(fù)制的是哪一個(gè)對(duì)象。
            o = (ShallowStudent) super.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println(e.toString());
        }
        return o;
    }

    public static void main(String[] args) {
        ShallowStudent s1 = new ShallowStudent("zhangsan", 18);
        ShallowStudent s2 = (ShallowStudent) s1.clone();
        s2.name = "lisi";
        s2.age = 20;
        //修改學(xué)生2后开呐,不影響學(xué)生1的值烟勋。
        System.out.println("name=" + s1.name + "," + "age=" + s1.age);
        System.out.println("name=" + s2.name + "," + "age=" + s2.age);
    }
}

Java的所有類都默認(rèn)繼承java.lang.Object類,在java.lang.Object類中有一個(gè)方法clone()筐付。 JDK API的說(shuō)明文檔解釋這個(gè)方法將返回Object對(duì)象的一個(gè)拷貝卵惦。要說(shuō)明的有兩點(diǎn):一是拷貝對(duì)象返回的是一個(gè)新對(duì)象,而不是一個(gè)引用家妆。二是拷貝對(duì)象與用 new操作符返回的新對(duì)象的區(qū)別就是這個(gè)拷貝已經(jīng)包含了一些原來(lái)對(duì)象的信息,而不是對(duì)象的初始信息冕茅。

上面代碼中有三個(gè)值得注意的地方伤极,一是希望能實(shí)現(xiàn)clone功能的CloneClass類實(shí)現(xiàn)了Cloneable接口,這個(gè)接口屬于java.lang包姨伤, java.lang包已經(jīng)被缺省的導(dǎo)入類中哨坪,所以不需要寫成java.lang.Cloneable。另一個(gè)值得請(qǐng)注意的是重載了clone()方法乍楚。最后在clone()方法中調(diào)用了super.clone()当编,這也意味著無(wú)論clone類的繼承結(jié)構(gòu)是什么樣的,super.clone()直接或間接調(diào)用了java.lang.Object類的clone()方法徒溪。

下面再詳細(xì)的解釋一下這幾點(diǎn): 應(yīng)該說(shuō)第三點(diǎn)是最重要的忿偷,仔細(xì)觀察一下Object類的clone()一個(gè)native方法,native方法的效率一般來(lái)說(shuō)都是遠(yuǎn)高于 java中的非native方法臊泌。這也解釋了為什么要用Object中clone()方法而不是先new一個(gè)類鲤桥,然后把原始對(duì)象中的信息賦到新對(duì)象中,雖然這也實(shí)現(xiàn)了clone功能渠概。對(duì)于第二點(diǎn)茶凳,也要觀察Object類中的clone()還是一個(gè)protected屬性的方法嫂拴。這也意味著如果要應(yīng)用 clone()方法,必須繼承Object類贮喧,在Java中所有的類是缺省繼承Object類的筒狠,也就不用關(guān)心這點(diǎn)了。然后重載clone()方法箱沦。還有一點(diǎn)要考慮的是為了讓其它類能調(diào)用這個(gè)clone類的clone()方法辩恼,重載之后要把clone()方法的屬性設(shè)置為public。

那么clone類為什么還要實(shí)現(xiàn)Cloneable接口呢饱普?稍微注意一下运挫,Cloneable接口是不包含任何方法的!其實(shí)這個(gè)接口僅僅是一個(gè)標(biāo)志套耕,而且這個(gè)標(biāo)志也僅僅是針對(duì)Object類中clone()方法的谁帕,如果clone類沒有實(shí)現(xiàn)Cloneable接口,并調(diào)用了Object的 clone()方法(也就是調(diào)用了super.Clone()方法)冯袍,那么Object的clone()方法就會(huì)拋出 CloneNotSupportedException異常匈挖。

說(shuō)明: ①為什么我們?cè)谂缮愔懈采wObject的clone()方法時(shí),一定要調(diào)用super.clone()呢康愤?在運(yùn)行時(shí)刻儡循,Object中的clone()識(shí)別出你要復(fù)制的是哪一個(gè)對(duì)象茉帅,然后為此對(duì)象分配空間何吝,并進(jìn)行對(duì)象的復(fù)制丁眼,將原始對(duì)象的內(nèi)容一一復(fù)制到新對(duì)象的存儲(chǔ)空間中频伤。 ②繼承自java.lang.Object類的clone()方法是淺復(fù)制爽醋。以下代碼可以證明之齐莲。

package com.king.cloneable;

/**
 * 淺復(fù)制2
 */
public class ShallowStudent2 implements Cloneable {
    String name;// 常量對(duì)象鬓长。
    int age;
    Professor p;// 學(xué)生1和學(xué)生2的引用值都是一樣的乏德。

    ShallowStudent2(String name, int age, Professor p) {
        this.name = name;
        this.age = age;
        this.p = p;
    }

    public Object clone() {
        ShallowStudent2 o = null;
        try {
            o = (ShallowStudent2) super.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println(e.toString());
        }
        return o;
    }

    public static void main(String[] args) {
        Professor p = new Professor("wangwu", 50);
        ShallowStudent2 s1 = new ShallowStudent2("zhangsan", 18, p);
        ShallowStudent2 s2 = (ShallowStudent2) s1.clone();
        s2.p.name = "lisi";
        s2.p.age = 30;
        System.out.println("name=" + s1.p.name + "," + "age=" + s1.p.age);
        System.out.println("name=" + s2.p.name + "," + "age=" + s2.p.age);
        //輸出結(jié)果學(xué)生1和2的教授成為lisi,age為30叔收。
    }
}

class Professor {
    String name;
    int age;

    Professor(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

從中可以看出齿穗,調(diào)用Object類中clone()方法產(chǎn)生的效果是:先在內(nèi)存中開辟一塊和原始對(duì)象一樣的空間,然后原樣拷貝原始對(duì)象中的內(nèi)容饺律。對(duì)基本數(shù)據(jù)類型窃页,這樣的操作是沒有問題的,但對(duì)非基本類型變量复濒,我們知道它們保存的僅僅是對(duì)象的引用脖卖,這也導(dǎo)致clone后的非基本類型變量和原始對(duì)象中相應(yīng)的變量指向的是同一個(gè)對(duì)象。大多時(shí)候巧颈,這種clone的結(jié)果往往不是我們所希望的結(jié)果胚嘲,這種clone也被稱為"影子clone"。

那應(yīng)該如何實(shí)現(xiàn)深層次的克隆洛二,即修改s2的教授不會(huì)影響s1的教授馋劈?代碼改進(jìn)如下攻锰。 改進(jìn)使學(xué)生1的Professor不改變(深層次的克隆):

package com.king.cloneable;

/**
 * 深復(fù)制
 */
public class DeepStudent implements Cloneable {
    String name;// 常量對(duì)象妓雾。
    int age;
    DeepProfessor p;// 學(xué)生1和學(xué)生2的引用值都是一樣的娶吞。

    DeepStudent(String name, int age, DeepProfessor p) {
        this.name = name;
        this.age = age;
        this.p = p;
    }

    public Object clone() {
        DeepStudent o = null;
        try {
            o = (DeepStudent) super.clone();
            //對(duì)引用的對(duì)象也進(jìn)行復(fù)制
            o.p = (DeepProfessor) p.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println(e.toString());
        }
        return o;
    }

    public static void main(String[] args) {
        DeepProfessor p = new DeepProfessor("wangwu", 50);
        DeepStudent s1 = new DeepStudent("zhangsan", 18, p);
        DeepStudent s2 = (DeepStudent) s1.clone();
        s2.p.name = "lisi";
        s2.p.age = 30;
        System.out.println("name=" + s1.p.name + "," + "age=" + s1.p.age);
        System.out.println("name=" + s2.p.name + "," + "age=" + s2.p.age);
        //輸出結(jié)果學(xué)生1和2的教授成為lisi,age為30。
    }
}

class DeepProfessor implements Cloneable {
    String name;
    int age;

    DeepProfessor(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Object clone() {
        DeepProfessor o = null;
        try {
            o = (DeepProfessor)super.clone();
        } catch(CloneNotSupportedException e) {
            System.out.println(e.toString());
        }
        return o;
    }
}

JDK中StringBuffer類型械姻,關(guān)于StringBuffer的說(shuō)明妒蛇,StringBuffer沒有重載clone()方法,更為嚴(yán)重的是StringBuffer還是一個(gè) final類楷拳,這也是說(shuō)我們也不能用繼承的辦法間接實(shí)現(xiàn)StringBuffer的clone绣夺。如果一個(gè)類中包含有StringBuffer類型對(duì)象或和 StringBuffer相似類的對(duì)象,我們有兩種選擇:要么只能實(shí)現(xiàn)影子clone欢揖,要么就在類的clone()方法中加一句(假設(shè)是 SringBuffer對(duì)象陶耍,而且變量名仍是p): o.p = new StringBuffer(p.toString()); //原來(lái)的是:o.p = (DeepProfessor) p.clone();

還要知道的是除了基本數(shù)據(jù)類型能自動(dòng)實(shí)現(xiàn)深度clone以外,String對(duì)象是一個(gè)例外她混,它c(diǎn)lone后的表現(xiàn)好象也實(shí)現(xiàn)了深度clone烈钞,雖然這只是一個(gè)假象,但卻大大方便了我們的編程坤按。

通過以上我們可以看出在某些情況下毯欣,我們可以利用clone方法來(lái)實(shí)現(xiàn)對(duì)象的深度復(fù)制,但對(duì)于比較復(fù)雜的對(duì)象(比如對(duì)象中包含其他對(duì)象臭脓,其他對(duì)象又包含別的對(duì)象.....)這樣我們必須進(jìn)行層層深度clone酗钞,每個(gè)對(duì)象需要實(shí)現(xiàn)cloneable接口,比較麻煩来累,那就繼續(xù)學(xué)習(xí)下一個(gè)序列化方法砚作。

利用串行化來(lái)做深復(fù)制

所謂對(duì)象序列化就是將對(duì)象的狀態(tài)轉(zhuǎn)換成字節(jié)流,以后可以通過這些值再生成相同狀態(tài)的對(duì)象佃扼。這個(gè)過程也可以通過網(wǎng)絡(luò)實(shí)現(xiàn)偎巢,可以先在Windows機(jī)器上創(chuàng)建一個(gè)對(duì)象蔼夜,對(duì)其序列化兼耀,然后通過網(wǎng)絡(luò)發(fā)給一臺(tái)Unix機(jī)器,然后在那里準(zhǔn)確無(wú)誤地重新?裝配?求冷。是不是很神奇瘤运。

也許你會(huì)說(shuō),只了解一點(diǎn)點(diǎn)匠题,但從來(lái)沒有接觸過拯坟,其實(shí)未必如此。RMI韭山、Socket郁季、JMS冷溃、EJB你總該用過一種吧,彼此為什么能夠傳遞Java對(duì)象梦裂,當(dāng)然都是對(duì)象序列化機(jī)制的功勞似枕。 第一次使用Java的對(duì)象序列化是做某項(xiàng)目,當(dāng)時(shí)要求把幾棵非常復(fù)雜的樹(JTree)及相應(yīng)的數(shù)據(jù)保存下來(lái)(就是我們常用的保存功能)年柠,以便下次運(yùn)行程序時(shí)可以繼續(xù)上次的操作凿歼。 那時(shí)XML技術(shù)在網(wǎng)上非常的熱,而且功能也強(qiáng)大冗恨,再加上樹的結(jié)構(gòu)本來(lái)就和XML存儲(chǔ)數(shù)據(jù)的格式很像答憔。作為一項(xiàng)對(duì)新技術(shù)比較有興趣的我當(dāng)然很想嘗試一下。不過經(jīng)過仔細(xì)分析掀抹,發(fā)現(xiàn)如果采用XML保存數(shù)據(jù)虐拓,后果真是難以想象:哪棵樹的哪個(gè)節(jié)點(diǎn)被展開、展開到第幾級(jí)渴丸、節(jié)點(diǎn)當(dāng)前的屬性是什么侯嘀。真是不知該用A、B谱轨、C還是用1戒幔、2、3來(lái)表示土童。

還好诗茎,發(fā)現(xiàn)了Java的對(duì)象序列化機(jī)制,問題迎刃而解献汗,只需簡(jiǎn)單的將每棵樹的根節(jié)點(diǎn)序列化保存到硬盤上敢订,下次再通過反序列化后的根節(jié)點(diǎn)就可以輕松的構(gòu)造出和原來(lái)一模一樣的樹來(lái)。

其實(shí)保存數(shù)據(jù)罢吃,尤其是復(fù)雜數(shù)據(jù)的保存正是對(duì)象序列化的典型應(yīng)用楚午。最近另一個(gè)項(xiàng)目就遇到了需要對(duì)非常復(fù)雜的數(shù)據(jù)進(jìn)行存取,通過使用對(duì)象的序列化尿招,問題同樣化難為簡(jiǎn)矾柜。

對(duì)象的序列化還有另一個(gè)容易被大家忽略的功能就是對(duì)象復(fù)制(Clone),Java中通過Clone機(jī)制可以復(fù)制大部分的對(duì)象就谜,但是眾所周知怪蔑,Clone有深層Clone和淺層Clone,如果你的對(duì)象非常非常復(fù)雜,假設(shè)有個(gè)100層的Collection(夸張了點(diǎn))丧荐,如果你想實(shí)現(xiàn)深層 Clone缆瓣,真是不敢想象,如果使用序列化虹统,不會(huì)超過10行代碼就可以解決弓坞。

主要是為了避免重寫比較復(fù)雜對(duì)象的深復(fù)制的clone()方法隧甚,也可以程序?qū)崿F(xiàn)斷點(diǎn)續(xù)傳等等功能。把對(duì)象寫到流里的過程是串行化(Serilization)過程渡冻,但是在Java程序師圈子里又非常形象地稱為“冷凍”或者“腌咸菜(picking)”過程呻逆;而把對(duì)象從流中讀出來(lái)的并行化(Deserialization)過程則叫做 “解凍”或者“回鮮(depicking)”過程。

應(yīng)當(dāng)指出的是菩帝,寫在流里的是對(duì)象的一個(gè)拷貝咖城,而原對(duì)象仍然存在于JVM里面,因此“腌成咸菜”的只是對(duì)象的一個(gè)拷貝呼奢,Java咸菜還可以回鮮宜雀。

在Java語(yǔ)言里深復(fù)制一個(gè)對(duì)象,常澄沾。可以先使對(duì)象實(shí)現(xiàn)Serializable接口辐董,然后把對(duì)象(實(shí)際上只是對(duì)象的一個(gè)拷貝)寫到一個(gè)流里(腌成咸菜),再?gòu)牧骼镒x出來(lái)(把咸菜回鮮)禀综,便可以重建對(duì)象简烘。

如下為深復(fù)制源代碼:

public Object deepClone() {    
   //將對(duì)象寫到流里    
   ByteArrayOutoutStream bo=new ByteArrayOutputStream();    
   ObjectOutputStream oo=new ObjectOutputStream(bo);    
   oo.writeObject(this);    
   //從流里讀出來(lái)    
   ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());    
   ObjectInputStream oi=new ObjectInputStream(bi);    
   return(oi.readObject());    
}

這樣做的前提是對(duì)象以及對(duì)象內(nèi)部所有引用到的對(duì)象都是可串行化的,否則定枷,就需要仔細(xì)考察那些不可串行化的對(duì)象或?qū)傩钥煞裨O(shè)成transient孤澎,從而將之排除在復(fù)制過程之外。上例代碼改進(jìn)如下欠窒。

package com.king.cloneable;

import java.io.*;

/**
 * 通過串行化實(shí)現(xiàn)深復(fù)制
 */
class Teacher implements Serializable {
    String name;
    int age;

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class DeepStudent2 implements Serializable {
    String name;//常量對(duì)象
    int age;
    Teacher t;//學(xué)生1和學(xué)生2的引用值都是一樣的覆旭。

    public DeepStudent2(String name, int age, Teacher t) {
        this.name = name;
        this.age = age;
        this.t = t;
    }

    public Object deepClone() throws IOException, ClassNotFoundException {//將對(duì)象寫到流里
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        ObjectOutputStream oo = new ObjectOutputStream(bo);
        oo.writeObject(this);//從流里讀出來(lái)
        ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream oi = new ObjectInputStream(bi);
        return (oi.readObject());
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Teacher t = new Teacher("tangliang", 30);
        DeepStudent2 s1 = new DeepStudent2("zhangsan", 18, t);
        DeepStudent2 s2 = (DeepStudent2) s1.deepClone();
        s2.t.name = "tony";
        s2.t.age = 40;
        //學(xué)生1的老師不改變
        System.out.println("name=" + s1.t.name + "," + "age=" + s1.t.age);
    }
}

雖然Java的序列化非常簡(jiǎn)單、強(qiáng)大岖妄,但是要用好型将,還有很多地方需要注意。比如曾經(jīng)序列化了一個(gè)對(duì)象荐虐,可由于某種原因七兜,該類做了一點(diǎn)點(diǎn)改動(dòng),然后重新被編譯福扬,那么這時(shí)反序列化剛才的對(duì)象腕铸,將會(huì)出現(xiàn)異常。

你可以通過添加serialVersionUID屬性來(lái)解決這個(gè)問題忧换。如果你的類是個(gè)單態(tài)(Singleton)類恬惯,是否允許用戶通過序列化機(jī)制復(fù)制該類向拆,如果不允許你需要謹(jǐn)慎對(duì)待該類的實(shí)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亚茬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浓恳,更是在濱河造成了極大的恐慌刹缝,老刑警劉巖碗暗,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異梢夯,居然都是意外死亡言疗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門颂砸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)噪奄,“玉大人,你說(shuō)我怎么就攤上這事人乓∏诶海” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵色罚,是天一觀的道長(zhǎng)碰缔。 經(jīng)常有香客問我,道長(zhǎng)戳护,這世上最難降的妖魔是什么金抡? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮腌且,結(jié)果婚禮上梗肝,老公的妹妹穿的比我還像新娘。我一直安慰自己铺董,他們只是感情好统捶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柄粹,像睡著了一般喘鸟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驻右,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天什黑,我揣著相機(jī)與錄音,去河邊找鬼堪夭。 笑死愕把,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的森爽。 我是一名探鬼主播恨豁,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爬迟!你這毒婦竟也來(lái)了橘蜜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎计福,沒想到半個(gè)月后跌捆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡象颖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年佩厚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片说订。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抄瓦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陶冷,到底是詐尸還是另有隱情闺鲸,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布埃叭,位于F島的核電站摸恍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赤屋。R本人自食惡果不足惜立镶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望类早。 院中可真熱鬧媚媒,春花似錦、人聲如沸涩僻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逆日。三九已至嵌巷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間室抽,已是汗流浹背搪哪。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坪圾,地道東北人晓折。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像兽泄,于是被迫代替她去往敵國(guó)和親漓概。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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