java.lang.object

Object類是Java中其他所有類的祖先苏携,沒有Object類Java面向?qū)ο鬅o從談起轻要。作為其他所有類的基類,Object具有哪些屬性和行為慨飘,是Java語言設(shè)計(jì)背后的思維體現(xiàn)响疚。

Object類位于java.lang包中鄙信,java.lang包包含著Java最基礎(chǔ)和核心的類,在編譯時(shí)會(huì)自動(dòng)導(dǎo)入忿晕。Object類沒有定義屬性装诡,一共有13個(gè)方法,具體的類定義結(jié)構(gòu)如下圖:

1.類構(gòu)造器public Object();

大部分情況下践盼,Java中通過形如 new A(args..)形式創(chuàng)建一個(gè)屬于該類型的對(duì)象鸦采。其中A即是類名,A(args..)即此類定義中相對(duì)應(yīng)的構(gòu)造函數(shù)咕幻。通過此種形式創(chuàng)建的對(duì)象都是通過類中的構(gòu)造函數(shù)完成渔伯。為體現(xiàn)此特性,Java中規(guī)定:在類定義過程中肄程,對(duì)于未定義構(gòu)造函數(shù)的類锣吼,默認(rèn)會(huì)有一個(gè)無參數(shù)的構(gòu)造函數(shù)选浑,作為所有類的基類,Object類自然要反映出此特性玄叠,在源碼中古徒,未給出Object類構(gòu)造函數(shù)定義,但實(shí)際上读恃,此構(gòu)造函數(shù)是存在的描函。

當(dāng)然,并不是所有的類都是通過此種方式去構(gòu)建狐粱,也自然的,并不是所有的類構(gòu)造函數(shù)都是public胆数。

2.private static native void registerNatives();

registerNatives函數(shù)前面有native關(guān)鍵字修飾肌蜻,Java中,用native關(guān)鍵字修飾的函數(shù)表明該方法的實(shí)現(xiàn)并不是在Java中去完成必尼,而是由C/C++去完成蒋搜,并被編譯成了.dll,由Java去調(diào)用判莉。方法的具體實(shí)現(xiàn)體在dll文件中豆挽,對(duì)于不同平臺(tái),其具體實(shí)現(xiàn)應(yīng)該有所不同券盅。用native修飾帮哈,即表示操作系統(tǒng),需要提供此方法锰镀,Java本身需要使用娘侍。具體到registerNatives()方法本身,其主要作用是將C/C++中的方法映射到Java中的native方法泳炉,實(shí)現(xiàn)方法命名的解耦憾筏。

既然如此,可能有人會(huì)問花鹅,registerNatives()修飾符為private氧腰,且并沒有執(zhí)行,作用何以達(dá)到刨肃?其實(shí)古拴,在Java源碼中,此方法的聲明后有緊接著一段靜態(tài)代碼塊:

1privatestaticnativevoidregisterNatives();2static{3registerNatives();4}

3.protected native Object clone() throws CloneNotSupportedException;

看之景,clone()方法又是一個(gè)被聲明為native的方法斤富,因此,我們知道了clone()方法并不是Java的原生方法锻狗,具體的實(shí)現(xiàn)是有C/C++完成的满力。clone英文翻譯為"克隆"焕参,其目的是創(chuàng)建并返回此對(duì)象的一個(gè)副本。形象點(diǎn)理解油额,這有一輛科魯茲叠纷,你看著不錯(cuò),想要個(gè)一模一樣的潦嘶。你調(diào)用此方法即可像變魔術(shù)一樣變出一輛一模一樣的科魯茲出來涩嚣。配置一樣,長(zhǎng)相一樣掂僵。但從此刻起航厚,原來的那輛科魯茲如果進(jìn)行了新的裝飾,與你克隆出來的這輛科魯茲沒有任何關(guān)系了锰蓬。你克隆出來的對(duì)象變不變完全在于你對(duì)克隆出來的科魯茲有沒有進(jìn)行過什么操作了幔睬。Java術(shù)語表述為:clone函數(shù)返回的是一個(gè)引用,指向的是新的clone出來的對(duì)象芹扭,此對(duì)象與原對(duì)象分別占用不同的堆空間麻顶。

明白了clone的含義后,接下來看看如果調(diào)用clone()函數(shù)對(duì)象進(jìn)行此克隆操作舱卡。

首先看一下下面的這個(gè)例子:

1packagecom.corn.objectsummary;23importcom.corn.Person;45publicclassObjectTest {67publicstaticvoidmain(String[] args) {89Object o1 =newObject();10//The method clone() from the type Object is not visible11Object clone =o1.clone();12}1314}

例子很簡(jiǎn)單辅肾,在main()方法中,new一個(gè)Oject對(duì)象后轮锥,想直接調(diào)用此對(duì)象的clone方法克隆一個(gè)對(duì)象矫钓,但是出現(xiàn)錯(cuò)誤提示:"The method clone() from the type Object is not visible"

why? 根據(jù)提示,第一反應(yīng)是ObjectTest類中定義的Oject對(duì)象無法訪問其clone()方法舍杜》莺梗回到Object類中clone()方法的定義,可以看到其被聲明為protected蝴簇,估計(jì)問題就在這上面了杯活,protected修飾的屬性或方法表示:在同一個(gè)包內(nèi)或者不同包的子類可以訪問。顯然熬词,Object類與ObjectTest類在不同的包中旁钧,但是ObjectTest繼承自O(shè)bject,是Object類的子類互拾,于是歪今,現(xiàn)在卻出現(xiàn)子類中通過Object引用不能訪問protected方法,原因在于對(duì)"不同包中的子類可以訪問"沒有正確理解颜矿。

"不同包中的子類可以訪問"寄猩,是指當(dāng)兩個(gè)類不在同一個(gè)包中的時(shí)候,繼承自父類的子類內(nèi)部且主調(diào)(調(diào)用者)為子類的引用時(shí)才能訪問父類用protected修飾的成員(屬性/方法)骑疆。 在子類內(nèi)部田篇,主調(diào)為父類的引用時(shí)并不能訪問此protected修飾的成員替废。!(super關(guān)鍵字除外)

于是泊柬,上例改成如下形式椎镣,我們發(fā)現(xiàn),可以正常編譯:

1packagecom.corn.objectsummary;234publicclassObjectTest {56publicstaticvoidmain(String[] args) {7ObjectTest ot1 =newObjectTest();89try{10ObjectTest ot2 =(ObjectTest) ot1.clone();11}catch(CloneNotSupportedException e) {12//TODO Auto-generated catch block13e.printStackTrace();14}15}1617}

是的兽赁,因?yàn)榇藭r(shí)的主調(diào)已經(jīng)是子類的引用了状答。

上述代碼在運(yùn)行過程中會(huì)拋出"java.lang.CloneNotSupportedException",表明clone()方法并未正確執(zhí)行完畢,問題的原因在與Java中的語法規(guī)定:

clone()的正確調(diào)用是需要實(shí)現(xiàn)Cloneable接口刀崖,如果沒有實(shí)現(xiàn)Cloneable接口惊科,并且子類直接調(diào)用Object類的clone()方法,則會(huì)拋出CloneNotSupportedException異常亮钦。

Cloneable接口僅是一個(gè)表示接口译断,接口本身不包含任何方法,用來指示Object.clone()可以合法的被子類引用所調(diào)用或悲。

于是,上述代碼改成如下形式堪唐,即可正確指定clone()方法以實(shí)現(xiàn)克隆巡语。

1packagecom.corn.objectsummary;23publicclassObjectTestimplementsCloneable {45publicstaticvoidmain(String[] args) {67ObjectTest ot1 =newObjectTest();89try{10ObjectTest ot2 =(ObjectTest) ot1.clone();11System.out.println("ot2:" +ot2);12}catch(CloneNotSupportedException e) {13//TODO Auto-generated catch block14e.printStackTrace();15}16}1718}

更多的關(guān)于Java克隆/復(fù)制相關(guān)的知識(shí)以后會(huì)給出專門的博文。

4.public final native Class getClass();

getClass()也是一個(gè)native方法淮菠,返回的是此Object對(duì)象的類對(duì)象/運(yùn)行時(shí)類對(duì)象Class男公。效果與Object.class相同。

首先解釋下"類對(duì)象"的概念:在Java中合陵,類是是對(duì)具有一組相同特征或行為的實(shí)例的抽象并進(jìn)行描述枢赔,對(duì)象則是此類所描述的特征或行為的具體實(shí)例。作為概念層次的類拥知,其本身也具有某些共同的特性踏拜,如都具有類名稱、由類加載器去加載低剔,都具有包速梗,具有父類,屬性和方法等襟齿。于是姻锁,Java中有專門定義了一個(gè)類,Class猜欺,去描述其他類所具有的這些特性位隶,因此,從此角度去看开皿,類本身也都是屬于Class類的對(duì)象涧黄。為與經(jīng)常意義上的對(duì)象相區(qū)分篮昧,在此稱之為"類對(duì)象"。

此處主要大量涉及到Java中的反射知識(shí)弓熏,關(guān)于反射相關(guān)知識(shí)后續(xù)也會(huì)給出相關(guān)博文恋谭。

5.public boolean equals(Object obj);

==與equals在Java中經(jīng)常被使用,大家也都知道==與equals的區(qū)別:

==表示的是變量值完成相同(對(duì)于基礎(chǔ)類型挽鞠,地址中存儲(chǔ)的是值疚颊,引用類型則存儲(chǔ)指向?qū)嶋H對(duì)象的地址);

equals表示的是對(duì)象的內(nèi)容完全相同信认,此處的內(nèi)容多指對(duì)象的特征/屬性材义。

實(shí)際上,上面說法是不嚴(yán)謹(jǐn)?shù)募奚停嗟闹皇浅R娪赟tring類中其掂。首先看一下Object類中關(guān)于equals()方法的定義:

1publicbooleanequals(Object obj) {2return(this==obj);3}

由此可見,Object原生的equals()方法內(nèi)部調(diào)用的正是==潦蝇,與==具有相同的含義款熬。既然如此,為什么還要定義此equals()方法攘乒?

equlas()方法的正確理解應(yīng)該是:判斷兩個(gè)對(duì)象是否相等贤牛。那么判斷對(duì)象相等的標(biāo)尺又是什么?

如上则酝,在object類中殉簸,此標(biāo)尺即為==。當(dāng)然沽讹,這個(gè)標(biāo)尺不是固定的般卑,其他類中可以按照實(shí)際的需要對(duì)此標(biāo)尺含義進(jìn)行重定義。如String類中則是依據(jù)字符串內(nèi)容是否相等來重定義了此標(biāo)尺含義爽雄。如此可以增加類的功能型和實(shí)際編碼的靈活性蝠检。當(dāng)然了,如果自定義的類沒有重寫equals()方法來重新定義此標(biāo)尺挚瘟,那么默認(rèn)的將是其父類的equals()蝇率,直到object基類

如下場(chǎng)景的實(shí)際業(yè)務(wù)需求刽沾,對(duì)于User bean本慕,由實(shí)際的業(yè)務(wù)需求可知當(dāng)屬性u(píng)id相同時(shí),表示的是同一個(gè)User侧漓,即兩個(gè)User對(duì)象相等锅尘。則可以重寫equals以重定義User對(duì)象相等的標(biāo)尺。

1packagecom.corn.objectsummary;23publicclassUser {45privateintuid;6privateString name;7privateintage;89publicintgetUid() {10returnuid;11}1213publicvoidsetUid(intuid) {14this.uid =uid;15}1617protectedString getName() {18returnname;19}2021publicvoidsetName(String name) {22this.name =name;23}2425publicintgetAge() {26returnage;27}2829publicvoidsetAge(intage) {30this.age =age;31}3233@Override34publicbooleanequals(Object obj) {35if(obj ==null|| !(objinstanceofUser)) {36returnfalse;37}38if(((User) obj).getUid() ==this.getUid()) {39returntrue;40}41returnfalse;42}43}

1packagecom.corn.objectsummary;23publicclassObjectTestimplementsCloneable {45publicstaticvoidmain(String[] args) {6User u1 =newUser();7u1.setUid(111);8u1.setName("張三");910User u2 =newUser();11u2.setUid(111);12u2.setName("張三豐");1314System.out.println(u1.equals(u2)); //返回true15}1617}

ObjectTest中打印出true,因?yàn)閁ser類定義中重寫了equals()方法藤违,這很好理解浪腐,很可能張三是一個(gè)人小名,張三豐才是其大名顿乒,判斷這兩個(gè)人是不是同一個(gè)人议街,這時(shí)只用判斷uid是否相同即可。

如上重寫equals方法表面上看上去是可以了璧榄,實(shí)則不然特漩。因?yàn)樗茐牧薐ava中的約定:重寫equals()方法必須重寫hasCode()方法。

6.public native int hashCode();

hashCode()方法返回一個(gè)整形數(shù)值骨杂,表示該對(duì)象的哈希碼值涂身。

hashCode()具有如下約定:

1).在Java應(yīng)用程序程序執(zhí)行期間,對(duì)于同一對(duì)象多次調(diào)用hashCode()方法時(shí)搓蚪,其返回的哈希碼是相同的蛤售,前提是將對(duì)象進(jìn)行equals比較時(shí)所用的標(biāo)尺信息未做修改。在Java應(yīng)用程序的一次執(zhí)行到另外一次執(zhí)行妒潭,同一對(duì)象的hashCode()返回的哈希碼無須保持一致悴能;

2).如果兩個(gè)對(duì)象相等(依據(jù):調(diào)用equals()方法),那么這兩個(gè)對(duì)象調(diào)用hashCode()返回的哈希碼也必須相等雳灾;

3).反之漠酿,兩個(gè)對(duì)象調(diào)用hasCode()返回的哈希碼相等,這兩個(gè)對(duì)象不一定相等佑女。

即嚴(yán)格的數(shù)學(xué)邏輯表示為: 兩個(gè)對(duì)象相等 <=> ?equals()相等 ?=> hashCode()相等。因此谈竿,重寫equlas()方法必須重寫hashCode()方法团驱,以保證此邏輯嚴(yán)格成立,同時(shí)可以推理出:hasCode()不相等 => equals()不相等 <=> 兩個(gè)對(duì)象不相等空凸。

可能有人在此產(chǎn)生疑問:既然比較兩個(gè)對(duì)象是否相等的唯一條件(也是沖要條件)是equals嚎花,那么為什么還要弄出一個(gè)hashCode(),并且進(jìn)行如此約定呀洲,弄得這么麻煩紊选?

其實(shí),這主要體現(xiàn)在hashCode()方法的作用上道逗,其主要用于增強(qiáng)哈希表的性能兵罢。

以集合類中,以Set為例滓窍,當(dāng)新加一個(gè)對(duì)象時(shí)卖词,需要判斷現(xiàn)有集合中是否已經(jīng)存在與此對(duì)象相等的對(duì)象,如果沒有hashCode()方法吏夯,需要將Set進(jìn)行一次遍歷此蜈,并逐一用equals()方法判斷兩個(gè)對(duì)象是否相等即横,此種算法時(shí)間復(fù)雜度為o(n)。通過借助于hasCode方法裆赵,先計(jì)算出即將新加入對(duì)象的哈希碼东囚,然后根據(jù)哈希算法計(jì)算出此對(duì)象的位置,直接判斷此位置上是否已有對(duì)象即可战授。(注:Set的底層用的是Map的原理實(shí)現(xiàn))

在此需要糾正一個(gè)理解上的誤區(qū):對(duì)象的hashCode()返回的不是對(duì)象所在的物理內(nèi)存地址页藻。甚至也不一定是對(duì)象的邏輯地址,hashCode()相同的兩個(gè)對(duì)象陈醒,不一定相等惕橙,換言之,不相等的兩個(gè)對(duì)象钉跷,hashCode()返回的哈希碼可能相同弥鹦。

因此,在上述代碼中爷辙,重寫了equals()方法后彬坏,需要重寫hashCode()方法。

1packagecom.corn.objectsummary;23publicclassUser {45privateintuid;6privateString name;7privateintage;89publicintgetUid() {10returnuid;11}1213publicvoidsetUid(intuid) {14this.uid =uid;15}1617protectedString getName() {18returnname;19}2021publicvoidsetName(String name) {22this.name =name;23}2425publicintgetAge() {26returnage;27}2829publicvoidsetAge(intage) {30this.age =age;31}3233@Override34publicbooleanequals(Object obj) {35if(obj ==null|| !(objinstanceofUser)) {36returnfalse;37}38if(((User) obj).getUid() ==this.getUid()) {39returntrue;40}41returnfalse;42}4344@Override45publicinthashCode() {46intresult = 17;47result = 31 * result +this.getUid();48returnresult;49}50}

注:上述hashCode()的重寫中出現(xiàn)了result*31膝晾,是因?yàn)閞esult*31 = (result<<5) - result栓始。之所以選擇31,是因?yàn)樽笠七\(yùn)算和減運(yùn)算計(jì)算效率遠(yuǎn)大于乘法運(yùn)算血当。當(dāng)然幻赚,也可以選擇其他數(shù)字。

7.public String toString();

toString()方法返回該對(duì)象的字符串表示臊旭。先看一下Object中的具體方法體:

1publicString toString() {2returngetClass().getName() + "@" +Integer.toHexString(hashCode());3}

toString()方法相信大家都經(jīng)常用到落恼,即使沒有顯式調(diào)用,但當(dāng)我們使用System.out.println(obj)時(shí)离熏,其內(nèi)部也是通過toString()來實(shí)現(xiàn)的佳谦。

getClass()返回對(duì)象的類對(duì)象,getClassName()以String形式返回類對(duì)象的名稱(含包名)滋戳。Integer.toHexString(hashCode())則是以對(duì)象的哈希碼為實(shí)參钻蔑,以16進(jìn)制無符號(hào)整數(shù)形式返回此哈希碼的字符串表示形式。

如上例中的u1的哈希碼是638奸鸯,則對(duì)應(yīng)的16進(jìn)制為27e咪笑,調(diào)用toString()方法返回的結(jié)果為:com.corn.objectsummary.User@27e。

因此:toString()是由對(duì)象的類型和其哈希碼唯一確定娄涩,同一類型但不相等的兩個(gè)對(duì)象分別調(diào)用toString()方法返回的結(jié)果可能相同蒲肋。

8/9/10/11/12. wait(...) / notify() / notifyAll()

一說到wait(...) / notify() | notifyAll()幾個(gè)方法,首先想到的是線程。確實(shí)兜粘,這幾個(gè)方法主要用于java多線程之間的協(xié)作申窘。先具體看下這幾個(gè)方法的主要含義:

wait():調(diào)用此方法所在的當(dāng)前線程等待,直到在其他線程上調(diào)用此方法的主調(diào)(某一對(duì)象)的notify()/notifyAll()方法孔轴。

wait(long timeout)/wait(long timeout, int nanos):調(diào)用此方法所在的當(dāng)前線程等待剃法,直到在其他線程上調(diào)用此方法的主調(diào)(某一對(duì)象)的notisfy()/notisfyAll()方法,或超過指定的超時(shí)時(shí)間量路鹰。

notify()/notifyAll():喚醒在此對(duì)象監(jiān)視器上等待的單個(gè)線程/所有線程贷洲。

wait(...) / notify() | notifyAll()一般情況下都是配套使用。下面來看一個(gè)簡(jiǎn)單的例子:

1packagecom.qqyumidi;23publicclassThreadTest {45/**6*@paramargs7*/8publicstaticvoidmain(String[] args) {9//TODO Auto-generated method stub10MyRunnable r =newMyRunnable();11Thread t =newThread(r);12t.start();13synchronized(r) {14try{15System.out.println("main thread 等待t線程執(zhí)行完");16r.wait();17System.out.println("被notity喚醒晋柱,得以繼續(xù)執(zhí)行");18}catch(InterruptedException e) {19//TODO Auto-generated catch block20e.printStackTrace();21System.out.println("main thread 本想等待优构,但被意外打斷了");22}23System.out.println("線程t執(zhí)行相加結(jié)果" +r.getTotal());24}25}26}2728classMyRunnableimplementsRunnable {29privateinttotal;3031@Override32publicvoidrun() {33//TODO Auto-generated method stub34synchronized(this) {35System.out.println("Thread name is:" +Thread.currentThread().getName());36for(inti = 0; i < 10; i++) {37total +=i;38}39notify();40System.out.println("執(zhí)行notif后同步代碼塊中依然可以繼續(xù)執(zhí)行直至完畢");41}42System.out.println("執(zhí)行notif后且同步代碼塊外的代碼執(zhí)行時(shí)機(jī)取決于線程調(diào)度");43}4445publicintgetTotal() {46returntotal;47}48}

運(yùn)行結(jié)果為:

1main thread 等待t線程執(zhí)行完2Thread name is:Thread-03執(zhí)行notif后同步代碼塊中依然可以繼續(xù)執(zhí)行直至完畢4執(zhí)行notif后且同步代碼塊外的代碼執(zhí)行時(shí)機(jī)取決于線程調(diào)度? //此行輸出位置有具體的JVM線程調(diào)度決定,有可能最后執(zhí)行5被notity喚醒雁竞,得以繼續(xù)執(zhí)行6線程t執(zhí)行相加結(jié)果45

既然是作用于多線程中钦椭,為什么卻是Object這個(gè)基類所具有的方法?原因在于理論上任何對(duì)象都可以視為線程同步中的監(jiān)聽器碑诉,且wait(...)/notify()|notifyAll()方法只能在同步代碼塊中才能使用彪腔。

從上述例子的輸出結(jié)果中可以得出如下結(jié)論:

1、wait(...)方法調(diào)用后當(dāng)前線程將立即阻塞进栽,且適當(dāng)其所持有的同步代碼塊中的鎖德挣,直到被喚醒或超時(shí)或打斷后且重新獲取到鎖后才能繼續(xù)執(zhí)行;

2快毛、notify()/notifyAll()方法調(diào)用后格嗅,其所在線程不會(huì)立即釋放所持有的鎖,直到其所在同步代碼塊中的代碼執(zhí)行完畢唠帝,此時(shí)釋放鎖屯掖,因此,如果其同步代碼塊后還有代碼没隘,其執(zhí)行則依賴于JVM的線程調(diào)度懂扼。

在Java源碼中禁荸,可以看到wait()具體定義如下:

1publicfinalvoidwait()throwsInterruptedException {2wait(0);3}

且wait(long timeout, int nanos)方法定義內(nèi)部實(shí)質(zhì)上也是通過調(diào)用wait(long timeout)完成右蒲。而wait(long timeout)是一個(gè)native方法。因此赶熟,wait(...)方法本質(zhì)上都是native方式實(shí)現(xiàn)瑰妄。

notify()/notifyAll()方法也都是native方法。

Java中線程具有較多的知識(shí)點(diǎn)映砖,是一塊比較大且重要的知識(shí)點(diǎn)间坐。后期會(huì)有博文專門針對(duì)Java多線程作出詳細(xì)總結(jié)。此處不再細(xì)述。

13. protected void finalize();

finalize方法主要與Java垃圾回收機(jī)制有關(guān)竹宋。首先我們看一下finalized方法在Object中的具體定義:

1protectedvoidfinalize()throwsThrowable { }

我們發(fā)現(xiàn)Object類中finalize方法被定義成一個(gè)空方法劳澄,為什么要如此定義呢?finalize方法的調(diào)用時(shí)機(jī)是怎么樣的呢蜈七?

首先秒拔,Object中定義finalize方法表明Java中每一個(gè)對(duì)象都將具有finalize這種行為,其具體調(diào)用時(shí)機(jī)在:JVM準(zhǔn)備對(duì)此對(duì)象所占用的內(nèi)存空間進(jìn)行垃圾回收前飒硅,將被調(diào)用砂缩。由此可以看出,此方法并不是由我們主動(dòng)去調(diào)用的(雖然可以主動(dòng)去調(diào)用三娩,此時(shí)與其他自定義方法無異)庵芭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市雀监,隨后出現(xiàn)的幾起案子双吆,更是在濱河造成了極大的恐慌,老刑警劉巖滔悉,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伊诵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡回官,警方通過查閱死者的電腦和手機(jī)曹宴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歉提,“玉大人笛坦,你說我怎么就攤上這事√蓿” “怎么了版扩?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)侄泽。 經(jīng)常有香客問我礁芦,道長(zhǎng),這世上最難降的妖魔是什么悼尾? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任柿扣,我火速辦了婚禮,結(jié)果婚禮上闺魏,老公的妹妹穿的比我還像新娘未状。我一直安慰自己,他們只是感情好析桥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布司草。 她就那樣靜靜地躺著艰垂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埋虹。 梳的紋絲不亂的頭發(fā)上猜憎,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音搔课,去河邊找鬼拉宗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辣辫,可吹牛的內(nèi)容都是我干的旦事。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼急灭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼姐浮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起葬馋,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤卖鲤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后畴嘶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛋逾,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年窗悯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了区匣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒋院,死狀恐怖亏钩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欺旧,我是刑警寧澤姑丑,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站辞友,受9級(jí)特大地震影響栅哀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜称龙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一留拾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茵瀑,春花似錦间驮、人聲如沸躬厌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸿捧,卻和暖如春屹篓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匙奴。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工堆巧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泼菌。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓谍肤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親哗伯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荒揣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法焊刹,內(nèi)部類的語法系任,繼承相關(guān)的語法,異常的語法虐块,線程的語...
    子非魚_t_閱讀 31,587評(píng)論 18 399
  • (一)Java部分 1俩滥、列舉出JAVA中6個(gè)比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,071評(píng)論 0 62
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司贺奠,掛了不少霜旧,但最終還是拿到小米、百度儡率、阿里颁糟、京東、新浪喉悴、CVTE棱貌、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,192評(píng)論 11 349
  • 自以為是的自以為是 就像貓摘下了帽子,我剃光了胡子箕肃。 聽說明天不會(huì)更好婚脱,所以今天不會(huì)更糟 來了就請(qǐng)入座 狐朋狗友萍...
    漻涸閱讀 241評(píng)論 1 3
  • 1.如何對(duì) Android 應(yīng)用進(jìn)行性能分析 2.什么情況下會(huì)導(dǎo)致內(nèi)存泄露 3.如何避免 OOM 異常 4.And...
    Hsveico閱讀 2,318評(píng)論 0 31