入門 Kotlin 和 Java 混合開(kāi)發(fā)

一暇昂、前沿

如果你學(xué)習(xí)過(guò)其他的編程語(yǔ)言邪狞,你就會(huì)發(fā)現(xiàn) Java 的語(yǔ)法很是哆嗦咳秉,可是我們?yōu)槭裁礇](méi)有放棄 Java 這門編程語(yǔ)言呢?因?yàn)?JVM 是一個(gè)非常好的平臺(tái)秉颗,而且 Java 程序員目前在中國(guó)所占的比重實(shí)在是太高了痢毒。這是歷史包袱導(dǎo)致的。暫且不說(shuō) Python蚕甥,語(yǔ)法絕對(duì)比 Java 簡(jiǎn)化的不是一個(gè)級(jí)別哪替,就連 C# 也比 Java 語(yǔ)法優(yōu)美很多。

我們知道梢灭,Java 程序運(yùn)行過(guò)程是這樣的:

編寫源代碼(.java)-> 編譯源文件(.class)-> JVM 虛擬機(jī)將 class 文件加載進(jìn)內(nèi)存夷家,執(zhí)行

既然如此,如果有一門語(yǔ)言同樣能編譯成 class 文件敏释,再由 JVM 去加載他库快,并且這門語(yǔ)言比 Java 語(yǔ)法更加優(yōu)美簡(jiǎn)潔,你樂(lè)不樂(lè)意去使用呢钥顽?那么這門優(yōu)秀的語(yǔ)言就是 Kotlin义屏。Kotlin 他的運(yùn)程過(guò)程是這樣的:

編寫源代碼(.kt)-> 編譯源文件(.class)-> JVM 虛擬機(jī)將 class 文件加載進(jìn)內(nèi)存,執(zhí)行蜂大。

2017年闽铐,Google 宣布 Kotlin 成為 Android 官方開(kāi)發(fā)語(yǔ)言,可見(jiàn)Kotlin 之好奶浦。

當(dāng)然兄墅,隨著 Kotlin 的發(fā)展,Kotlin 已經(jīng)不單單是 JVM 平臺(tái)上的語(yǔ)言澳叉,也可以將 Kotlin 代碼編譯為 JavaScript隙咸,未來(lái)還會(huì)有 Kotlin Native,可見(jiàn) Kotlin 絕對(duì)是極具潛力成洗。

二五督、學(xué)習(xí) Kotlin 前準(zhǔn)備

工欲善其事,必先利其器瓶殃。首先一定要選擇一個(gè)好的 IDE充包,Kotlin 是由 JetBrains 公司開(kāi)發(fā),那么我們當(dāng)然要用 JetBrains 公司自家的 IDE 啦遥椿,我們就選用 IDEA基矮!相信現(xiàn)在絕大多數(shù) Java 開(kāi)發(fā)者都在用的淆储。

enter image description here
image.gif

?

我們新建一個(gè)普通項(xiàng)目即可。

如果我們要寫 Kotlin 代碼愈捅,很簡(jiǎn)單遏考,右鍵,新建一個(gè) Kotlin 文件即可蓝谨。

enter image description here
image.gif

?

新建文件后灌具,IDE 會(huì)提示我們需要配置,按照提示譬巫,配置一下即可咖楣。

enter image description here
image.gif

?

三、Kotlin 語(yǔ)法簡(jiǎn)介

如果你已經(jīng)學(xué)習(xí)過(guò)了 Java芦昔,入門 Kotlin 會(huì)很快诱贿。

我們先來(lái)寫一個(gè)Hello world!

打開(kāi)我們新建好的 kt 文件,輸入以下代碼:

fun main(args: Array<String>) {
    print("hello world")
}

image.gif

我們?cè)賮?lái)回顧一下 Java 代碼:

class HelloWord{
public static void main(String[] args){
System.out.println("Hello world");
     }
}

image.gif

我們對(duì)比一下咕缎,Kotlin 的代碼非常少珠十。我們 Java 中,方法必須寫在類中凭豪,而我們的 Kotlin 支持包級(jí)函數(shù)焙蹭,靜態(tài)方法不需要寫在一個(gè)類中。并且 Kotlin 每一句結(jié)束不需要分號(hào)嫂伞。

在 Kotlin 中孔厉,所有變量聲明都需要用 val 或 var 修飾,并且支持類型推斷帖努,但你需要注意的是撰豺,Kotlin 是一個(gè)靜態(tài)語(yǔ)言。

變量聲明格式 : val/var 變量名(:類型拼余,可不寫污桦,會(huì)自動(dòng)推斷)

image.gif

val i=1val i:Int =1 的效果是一樣的。

var i=1val i=1 如果被翻譯成 Java 分別就是:

final int i=1
int i=1

image.gif

被 val 修飾的變量編譯后會(huì)被翻譯成類似于 java 中的 final 關(guān)鍵字匙监,這是 Kotlin 一大特點(diǎn)凡橱,在 Kotlin 中所有類,方法都會(huì)默認(rèn)是 final 的舅柜。

小編這邊建議您,初學(xué)的時(shí)候多看看 Kotlin 翻譯成 Java 的字節(jié)碼躲惰。 我們的 IDE 已經(jīng)有相關(guān)插件了:

enter image description here
image.gif

?

點(diǎn)擊后會(huì)出現(xiàn)如圖界面:

enter image description here
image.gif

?

再點(diǎn)擊紅色框中的按鈕致份,就會(huì)顯示我們 Kotlin 被翻譯成 Java 的代碼了。

優(yōu)秀的表達(dá)式

我們觀察以下代碼:

enter image description here
image.gif

?

他和我們 Java 中的 if else 有哪些不同础拨?

我們表達(dá)式也可以有返回值了氮块,注意千萬(wàn)不要寫 return xxx绍载,因?yàn)?return 就跳出方法了。在 Kotlin 中滔蝉,條件表達(dá)式的最后一句就可以作為返回值击儡,這一個(gè)小技能可以說(shuō)非常實(shí)用,類似的還有 try蝠引、catch 也有類似的功能阳谍。

加強(qiáng)版 switch

本人作為一名資深 Java 開(kāi)發(fā)者,確很少用 switch螃概,一來(lái) switch 必須對(duì)相同類型進(jìn)行操作矫夯,功能單一,可能還沒(méi)有 if 強(qiáng)大吊洼,而且經(jīng)常使用會(huì)增加代碼耦合度训貌,一般會(huì)使用多態(tài)結(jié)合相關(guān)的設(shè)計(jì)模式來(lái)代替。

我們來(lái)看看 Kotlin 中加強(qiáng)版的 switch 表達(dá)式 when:

enter image description here
image.gif

?

當(dāng)滿足第一個(gè) case 分支冒窍,就會(huì)結(jié)束這個(gè)表達(dá)式递沪。同理,他也可能作為一個(gè)表達(dá)式综液,每一個(gè)分支最后一句可以返回一個(gè)值款慨,再給一個(gè)變量去接收,是不是比 switch 強(qiáng)大了一萬(wàn)倍呢意乓!

模板字符串

這個(gè)功能可是非常實(shí)用樱调,我們?cè)?java 中可能常常會(huì)有拼接字符串的痛苦,沒(méi)事届良,Kotlin 可以解決你的這個(gè)痛苦笆凌,我們看看這個(gè)代碼:

enter image description here
image.gif

?

我們?cè)谧址校褂?${}士葫,在花括號(hào)中乞而,可以寫 Java 代碼,這樣就達(dá)到了模板字符串的效果慢显。當(dāng)然你也可以這樣這樣做:

enter image description here
image.gif

?

使用 $ 加上變量名可以直接輸出這個(gè)變量爪模。那么我們?nèi)绻胼敵?$,那么就需要轉(zhuǎn)義了荚藻,和 Java 一樣屋灌,使用 \

包裝類和基本數(shù)據(jù)類型不存在了

在 Java 中類似 int应狱、double 等等所有基本數(shù)據(jù)類型都有其對(duì)應(yīng)的包裝類共郭,在 Kotlin 中不存在了,一律使用 Int、Double除嘹、Float写半、String……

在編譯的時(shí)候,Kotlin 會(huì)根據(jù)我們的情況智能選擇基本數(shù)據(jù)類型還是包裝類尉咕,不需要程序員去操心了叠蝇。

data class,再見(jiàn) Java bean

我們?cè)趯?JavaBean 一般過(guò)程是寫上一個(gè) class 類年缎,里面編寫若干個(gè)字段悔捶,然后給上若干個(gè) get/set 方法,有時(shí)候還會(huì)重寫 toString晦款、equals炎功、HashCode 方法。

這些過(guò)程其實(shí)也有些重復(fù)缓溅,如果我們使用 Kotlin 為我們提供的 data class 編寫一個(gè)類:

data class Person(val username:String,val age:Int)

image.gif

這樣我們就寫好了一個(gè) data class蛇损,短短一句話,我們從聲明也可以看出坛怪,我們給 Person 這個(gè)類定義了 username 和 age 兩個(gè)屬性淤齐,我們使用 IDEA 自帶插件,把他翻譯成 Java 代碼看看:

public final class Person {    @NotNull    private final String
username;    private final int age;

   @NotNull    public final String getUsername() {
      return this.username;    }

   public final int getAge() {
      return this.age;    }

   public Person(@NotNull String username, int age) {
      Intrinsics.checkParameterIsNotNull(username, "username");
      super();
      this.username = username;
      this.age = age;    }

   @NotNull    public final String component1() {
      return this.username;    }

   public final int component2() {
      return this.age;    }

   @NotNull    public final Person copy(@NotNull String username, int
age) {
      Intrinsics.checkParameterIsNotNull(username, "username");
      return new Person(username, age);    }

   // $FF: synthetic method    // $FF: bridge method    @NotNull   
public static Person copy$default(Person var0, String var1, int var2,
int var3, Object var4) {
      if ((var3 & 1) != 0) {
         var1 = var0.username;
      }

      if ((var3 & 2) != 0) {
         var2 = var0.age;
      }

      return var0.copy(var1, var2);    }

   public String toString() {
      return "Person(username=" + this.username + ", age=" + this.age + ")";    }

   public int hashCode() {
      return (this.username != null ? this.username.hashCode() : 0) * 31 + this.age;    }

   public boolean equals(Object var1) {
      if (this != var1) {
         if (var1 instanceof Person) {
            Person var2 = (Person)var1;
            if (Intrinsics.areEqual(this.username, var2.username) && this.age == var2.age) {
               return true;
            }
         }

         return false;
      } else {
         return true;
      }    } }

image.gif

data class 太厲害了袜匿,Kotlin 在編譯的時(shí)候會(huì)自動(dòng)幫我們加上 get/set 方法更啄,還會(huì)為我們加上 tostring、euqals居灯、hashcode 方法祭务。

不過(guò),你要注意的是怪嫌,Kotlin 類默認(rèn)是 final 的义锥,所以我的 data class 是不能被繼承的,而且他沒(méi)有無(wú)參的構(gòu)造方法岩灭。如果這樣直接使用 MyBatis 是會(huì)報(bào)這個(gè)類找不到無(wú)參構(gòu)造方法的錯(cuò)的拌倍。

為了解決這些問(wèn)題,Kotlin 官方推薦了 no-arg 插件來(lái)解決這一問(wèn)題噪径,如果你想讓 data class 編譯時(shí)候去掉 final 關(guān)鍵字柱恤,可以使用 Kotlin 官方插件 all-open 插件來(lái)解決這一問(wèn)題。

插句題外話找爱,在 Spring5 中梗顺,Spring 專門針對(duì) Kotlin 做過(guò)很多的優(yōu)化。比如车摄,AOP 這一底層實(shí)現(xiàn)寺谤,相信有一定功底的人士都知道珍德,spring 會(huì)為這個(gè)類使用 CGLIB 技術(shù)動(dòng)態(tài)生成一個(gè)子類。而我們的 Kotlin 類默認(rèn)是 final 的矗漾,因此,如果我們是用 Kotlin 寫的 AOP薄料,想讓我們寫的 AOP 類能正常運(yùn)行敞贡,就必須在 class 前面加上 open∩阒埃可每次寫很麻煩誊役,我們索引官方也推出了一個(gè) kotlin-spring 插件,可以為這些類自動(dòng)去 final 關(guān)鍵字谷市。

空指針異常不存在了

Kotlin 中所有類型都區(qū)分非空或可空類型蛔垢,比如可空的 Int,就是 Int?迫悠,如果這個(gè)類型允許空鹏漆,我們就在這個(gè)類型后面加個(gè) ?,不加 ? 的話則這個(gè)類型不可為空创泄!

比如我們定義一個(gè)方法某一個(gè)參數(shù)類型后面我們就指定了 ?艺玲,我們可以傳遞 Null,反之則不可以鞠抑,或者加上 ! 強(qiáng)制傳遞饭聚。

Kotlin 的絕技實(shí)在是太多了,包括還有定義方法的時(shí)候搁拙,我可以給參數(shù)指定默認(rèn)值秒梳,調(diào)用的時(shí)候也可以指定參數(shù)名的時(shí)候進(jìn)行傳遞,在編譯時(shí)候箕速,Kotlin 會(huì)生成若干個(gè)重載的 Java 方法酪碘。當(dāng)然這只是九牛一毛,Kotlin 最強(qiáng)大的就是高階函數(shù)和函數(shù)式編程了弧满,并且支持科理化婆跑。支持運(yùn)算符重載,可以為類增加擴(kuò)展方法庭呜,強(qiáng)大到令人發(fā)指滑进。

同時(shí),Kotlin 還支持協(xié)和編程(目前這塊不太成熟)募谎,由于篇幅有限扶关,如果大家有興趣,我可以再做一次專題講解数冬。

編寫單例類

單例模式是 23 種設(shè)計(jì)模式中非常常用的設(shè)計(jì)模式之一节槐。在 Kotlin 中也有提供我們非巢笫快捷的方式編寫單例類,實(shí)現(xiàn)單例僅僅只需要一行代碼:

object Singleton

image.gif

是的铜异,你沒(méi)有看錯(cuò)哥倔,只需要寫2個(gè)單詞 ,object 代表聲明一個(gè)單例類揍庄,Singleton 為單例的類名咆蒿,是不是很Easy?

我們測(cè)試一下:

enter image description here
image.gif

?

這里補(bǔ)充一下蚂子,由于 Kotlin 支持運(yùn)算符重載沃测,在 Kotlin 中,雙等號(hào)等同于調(diào)用 equals 方法食茎,三等號(hào)才是比較內(nèi)存地址蒂破。我們看到這里輸出的是 true,則說(shuō)明别渔,輸出的是同一個(gè)對(duì)象附迷。我們?cè)賮?lái)看看他字節(jié)碼,翻譯成 Java 的代碼:

enter image description here
image.gif

?

可以看出哎媚,就是一個(gè)簡(jiǎn)單的單例模式挟秤。構(gòu)造方法沒(méi)有顯示出來(lái),其實(shí)是私有化的抄伍。其實(shí)我們還是可以通過(guò)反射去修改構(gòu)造方法訪問(wèn)修飾符來(lái)破壞他的單例的艘刚。

擴(kuò)展方法

相信如果你做過(guò)多年的 Java 開(kāi)發(fā),手頭上一定有大量的 Util 類截珍,比如 DateUtils攀甚、HtmlUtils、StringUtils 等等岗喉,其實(shí)這都是 Java 這門語(yǔ)言造成的秋度,當(dāng)你學(xué)會(huì)擴(kuò)展方法后,從此告別 Util钱床。

比如我們要判斷一個(gè)字符串是否長(zhǎng)度大于 0荚斯,我們無(wú)非要判斷他不為 null,且長(zhǎng)度大于 0查牌,如果用 Java 去實(shí)現(xiàn)相信你一定會(huì)寫一個(gè) StringUtils事期,那么我們?nèi)绾斡?Kotlin 的擴(kuò)展方法去實(shí)現(xiàn)呢?

我們?yōu)?String 擴(kuò)展一個(gè) isNullOrEmpty 方法纸颜,如何返回 false兽泣,則說(shuō)明長(zhǎng)度大于 0。

我們?cè)诙x方法的時(shí)候前面加上對(duì)應(yīng)的類名即可變成擴(kuò)展方法了胁孙。

fun String.isNullOrEmpty():Boolean{
    return !(this!=null&& this.isNotEmpty())
}

image.gif

這個(gè)代碼可以寫在任何地方唠倦。

我們寫測(cè)試類調(diào)用:

enter image description here
image.gif

?

是不是很自然称鳞。向 Util 說(shuō)再見(jiàn)吧!其實(shí)我們的 Kotlin 在 String 類稠鼻,集合類冈止,IO 類等 JDK 很多類都提供了大量的擴(kuò)展方法,比如我們學(xué)一個(gè)文本文件候齿,現(xiàn)在只需要一句話:

val file = System.IO.File("d:/1.txt")
    println(file.readText())

image.gif

readText 就是 Kotlin 為我們寫的擴(kuò)展方法靶瘸,類似的其實(shí)還有很多。因此毛肋,使用 Kotlin 一定會(huì)大大提高你的工作效率。

運(yùn)算符重載

在 Kotlin 中屋剑,每一個(gè)運(yùn)行符對(duì)應(yīng)一個(gè)該類中的方法润匙,如果該類中有相應(yīng)的方法實(shí)現(xiàn),就可以進(jìn)行運(yùn)算符重載唉匾。

就連調(diào)用方法其實(shí)也是一樣孕讳,比如我們調(diào)用 a(b),等同于 a.invoke(b)

表達(dá)式 對(duì)應(yīng)轉(zhuǎn)換
a + b a.plus(b)
a - b a.minus(b)
a * b a.times(b)
a / b a.div(b)
a % b a.mod(b)
a..b a.rangeTo(b)
a[i] a.get(i)
a[i, j] a.get(i, j)
a[i_1, …, i_n] a.get(i_1, … , i_n)
a[i] = b a.set(i, b)
a[i,j] =b a.set(i, j, b)
a[i_1, … , i_n] = b a.set(i_1,… ,o_n,b)
a in b b.contains(a)
a !in b !b.contains(a)
a[i] a.get(i)
a[i, j] a.get(i, j)
a[i_1, …, i_n] a.get(i_1, … , i_n)
a[i] = b a.set(i, b)
a[i,j] =b a.set(i, j, b)
a[i_1, … , i_n] = b a.set(i_1,… ,o_n,b)

我們舉個(gè)例子巍膘,假如我們要計(jì)算一個(gè)日期后的若干天厂财,我們?nèi)绻?Java 去干,相信你一定要寫不少于 10 行代碼峡懈,而且會(huì)很痛苦璃饱。而在 Kotlin 中,有了運(yùn)算符重載肪康,我就有了一個(gè)很好的思路荚恶,讓 data+1 就返回一天后的日期,是不是很絕磷支?

說(shuō)到做到谒撼,我們來(lái)實(shí)現(xiàn):

根據(jù)上面表我們可以看出,+ 要重載的方法是 plus雾狈±保可是 Date 類是 JDK 為我們提供的,我們?nèi)绾稳樗砑右粋€(gè)方法呢善榛?沒(méi)錯(cuò)辩蛋,我們之前講過(guò),Kotlin 支持類的擴(kuò)展方法移盆,我們?yōu)?Date 類擴(kuò)展一個(gè) plus 方法堪澎,擴(kuò)展方法和運(yùn)算符重載結(jié)合起來(lái)也會(huì)被識(shí)別。

對(duì)了味滞,重點(diǎn)還沒(méi)有說(shuō)樱蛤,如何定義運(yùn)算符重載呢钮呀??jī)H僅寫對(duì)應(yīng)的方法還不足夠,還要在 fun 前面加上 operator 關(guān)鍵字昨凡。所以爽醋,我們寫出如下代碼:

operator fun Date.plus(nextVal:Int):Date{
    val calendar = GregorianCalendar()
    calendar.time = this
    calendar.add(Calendar.DATE, nextVal)
    return calendar.time
}

image.gif

為了方便查看日期字符串,我們?cè)贁U(kuò)展一個(gè) stringFormat 方法便脊,由于"yyyy-MM-dd"格式太常用蚂四,我們?cè)俳o他一個(gè)默認(rèn)值。

fun Date.stringFormat(formatType:String = "yyyy-MM-dd"):String{
    return SimpleDateFormat(formatType).format(this)
}

image.gif

寫測(cè)試方法:

enter image description here
image.gif

?

絕了哪痰,不得不感嘆 Kotlin 的偉大遂赠!

四、Kotlin 與 Java 混合開(kāi)發(fā)

由于 Kotlin 和 Java 編譯成 class 文件后完成一樣晌杰,所以 Kotlin 和 Java 有著天然的兼容性跷睦,100% 兼容。在 Kotlin 中你可以隨意的去使用 JVM 中定義好的類肋演,也可以是你自己寫好的 Java 類抑诸,同一個(gè)項(xiàng)目中你可以既有 Java 類,也可以有 Kotlin 類爹殊。

比如你定義了一個(gè) data class Person 類蜕乡,在同一個(gè)項(xiàng)目中,你可以新建一個(gè) Java 類梗夸,使用 Person person = new Person(“小明”,12); 這完全沒(méi)有問(wèn)題的层玲。同樣,你用 Kotlin 定義好的類反症,在 Java 中可以同樣使用称簿。所在,從現(xiàn)在開(kāi)始使用 Kotlin惰帽,不要怕憨降,即使有地方你擔(dān)心 Kotlin 自己不熟悉而實(shí)現(xiàn)不了,那你也可以在這時(shí)候使用 Java 去實(shí)現(xiàn)该酗。100% 兼容授药,Java 中的所有類庫(kù)都可以去使用。

這里附上一張 Kotlin 使用 SSM 圖:

enter image description here
image.gif

?

可以看出呜魄,源碼是 Kotlin 的悔叽,我們同樣可以使用 Spring 框架,再附上這個(gè)項(xiàng)目源文件爵嗅。

enter image description here
image.gif

?

文件前面圖標(biāo)右下角帶 K 的都是 Kotlin 文件娇澎,可見(jiàn),Kotlin 和 Java 是非常好的睹晒。

那么趟庄,像擴(kuò)展方法括细、運(yùn)算符重載、默認(rèn)參數(shù)這類的我們?cè)撚?Java 如何去調(diào)用呢戚啥?

這里有很遺憾了奋单,由于 Java 語(yǔ)法的限制我們不能像 Kotlin 那樣去使用,但這并不代表我們不能用 Java 去調(diào)用猫十,我們?cè)?Java 中览濒,只能當(dāng)成一個(gè)普通方法去使用了。

五拖云、Kotlin 與 Java 總結(jié)

個(gè)人認(rèn)為 Kotlin 取代 Java 只是時(shí)間問(wèn)題贷笛,現(xiàn)如今 Java 的更新速度已經(jīng)很緩慢了,已經(jīng)有越來(lái)越多的 Java 開(kāi)發(fā)者去轉(zhuǎn)戰(zhàn) Kotlin 這門語(yǔ)言宙项。即使你現(xiàn)在的項(xiàng)目已經(jīng)用 Java 寫的很多乏苦,從今天開(kāi)始你也可以使用 Kotlin,與 Java 百分之一百兼容杉允,這是他的最大的特點(diǎn)。在未來(lái)席里,Kotlin 也必定會(huì)走出 JVM 這個(gè)平臺(tái)叔磷,準(zhǔn)確說(shuō),現(xiàn)在已經(jīng)邁出了奖磁,未來(lái)會(huì)越來(lái)越強(qiáng)大改基。

祝讀者好運(yùn),感謝大家的閱讀咖为!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載秕狰,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末躁染,一起剝皮案震驚了整個(gè)濱河市鸣哀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吞彤,老刑警劉巖我衬,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異饰恕,居然都是意外死亡挠羔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門埋嵌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)破加,“玉大人,你說(shuō)我怎么就攤上這事雹嗦》兑ǎ” “怎么了合是?”我有些...
    開(kāi)封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)尿背。 經(jīng)常有香客問(wèn)我端仰,道長(zhǎng),這世上最難降的妖魔是什么田藐? 我笑而不...
    開(kāi)封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任荔烧,我火速辦了婚禮,結(jié)果婚禮上汽久,老公的妹妹穿的比我還像新娘鹤竭。我一直安慰自己,他們只是感情好景醇,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布臀稚。 她就那樣靜靜地躺著,像睡著了一般三痰。 火紅的嫁衣襯著肌膚如雪吧寺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天散劫,我揣著相機(jī)與錄音稚机,去河邊找鬼。 笑死获搏,一個(gè)胖子當(dāng)著我的面吹牛赖条,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播常熙,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纬乍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了裸卫?” 一聲冷哼從身側(cè)響起仿贬,我...
    開(kāi)封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墓贿,沒(méi)想到半個(gè)月后诅蝶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡募壕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年调炬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舱馅。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缰泡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棘钞,我是刑警寧澤缠借,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站宜猜,受9級(jí)特大地震影響泼返,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姨拥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一绅喉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叫乌,春花似錦柴罐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至排宰,卻和暖如春似芝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背板甘。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工党瓮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虾啦。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓麻诀,卻偏偏與公主長(zhǎng)得像痕寓,于是被迫代替她去往敵國(guó)和親傲醉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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