黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

java解惑你知多少(六)

系統(tǒng) 2280 0

41.?instanceof與轉(zhuǎn)型

Java代碼?? 收藏代碼
  1. System.out.println( null ? instanceof ?String); //false ??
  2. System.out.println( new ?Object()? instanceof ?String); //false ??
  3. //編譯能通過(guò) ??
  4. System.out.println((Object)? new ?Date()? instanceof ?String); //false ??
  5. //!!程序不具有實(shí)際意義,但編譯時(shí)不能通過(guò) ??
  6. //!!System.out.println(new?Date()?instanceof?String); ??
  7. //!!運(yùn)行時(shí)拋ClassCastException,這個(gè)程序沒(méi)有任何意義,但可以編譯 ??
  8. //!!System.out.println((Date)?new?Object()); ??

null可以表示任何引用類型,但是instanceof操作符被定義為在其左操作數(shù)為null時(shí)返回false。

?

如果instanceof告訴你一個(gè)對(duì)象引用是某個(gè)特定類型的實(shí)例,那么你就可以將其轉(zhuǎn)型為該類型,并調(diào)用該類型的方法

,而不用擔(dān)心會(huì)拋出ClassCastException或NullPointerException異常。

?

instanceof操作符有這樣的要求:左操作數(shù)要是一個(gè)對(duì)象的或引用,右操作數(shù)是一個(gè)引用類型,并且這兩個(gè)操作數(shù)的

類型是要父子關(guān)系(左是右的子類,或右是左的子類都行),否則編譯時(shí)就會(huì)出錯(cuò)。


42.?父類構(gòu)造器調(diào)用已重寫的方法

Java代碼?? 收藏代碼
  1. public ? class ?P?{??
  2. ? private ? int ?x,?y;??
  3. ? private ?String?name;??
  4. ??
  5. ?P( int ?x,? int ?y)?{??
  6. ?? this .x?=?x;??
  7. ?? this .y?=?y;??
  8. ?? //?這里實(shí)質(zhì)上是調(diào)用子類被重寫的方法 ??
  9. ??name?=?makeName();??
  10. ?}??
  11. ??
  12. ? protected ?String?makeName()?{??
  13. ?? return ? "[" ?+?x?+? "," ?+?y?+? "]" ;??
  14. ?}??
  15. ??
  16. ? public ?String?toString()?{??
  17. ?? return ?name;??
  18. ?}??
  19. ??
  20. }??
  21. ??
  22. class ?S? extends ?P?{??
  23. ? private ?String?color;??
  24. ??
  25. ?S( int ?x,? int ?y,?String?color)?{??
  26. ?? super (x,?y);??
  27. ?? this .color?=?color;??
  28. ?}??
  29. ??
  30. ? protected ?String?makeName()?{??
  31. ?? return ? super .makeName()?+? ":" ?+?color;??
  32. ?}??
  33. ??
  34. ? public ? static ? void ?main(String[]?args)?{??
  35. ??System.out.println( new ?S( 1 ,? 2 ,? "red" )); //?[1,2]:null ??
  36. ?}??
  37. }??

?

在一個(gè)構(gòu)造器調(diào)用一個(gè)已經(jīng)被其子類重寫了的方法時(shí),可能會(huì)出問(wèn)題:如果子類重寫的方法要訪問(wèn)的子類的域還未初

始化,因?yàn)檫@種方式被調(diào)用的方法總是在實(shí)例初始化之前執(zhí)行。要想避免這個(gè)問(wèn)題,就千萬(wàn)不要在父類構(gòu)造器中調(diào)用

已重寫的方法。


43.?靜態(tài)域與靜態(tài)塊的初始順序

Java代碼?? 收藏代碼
  1. public ? class ?T?{??
  2. ? public ? static ? int ?i?=?prt();??
  3. ? public ? static ? int ?y?=? 1 ;??
  4. ? public ? static ? int ?prt()?{??
  5. ?? return ?y;??
  6. ?}??
  7. ??
  8. ? public ? static ? void ?main(String[]?args)?{??
  9. ??System.out.println(T.i); //?0 ??
  10. ?}??
  11. }??

上面的結(jié)果不是1,而是0,為什么?

?

類初始化是按照靜態(tài)域或靜態(tài)塊在源碼中出現(xiàn)的順序去執(zhí)行這些靜態(tài)初始器的(即誰(shuí)先定義,就先初始化誰(shuí)),上現(xiàn)程序中由于i先于y聲明,所以先初始化i,但由于i初始化時(shí)需要由y來(lái)決定,此時(shí)y又未初始化,實(shí)為初始前的值0,所以i的最后結(jié)果為0。


44.?請(qǐng)使用引用類型調(diào)用靜態(tài)方法

Java代碼?? 收藏代碼
  1. public ? class ?Null?{??
  2. ? public ? static ? void ?greet()?{??
  3. ??System.out.println( "Hello?world!" );??
  4. ?}??
  5. ??
  6. ? public ? static ? void ?main(String[]?args)?{??
  7. ??((Null)? null ).greet();??
  8. ?}??
  9. }??

上面程序運(yùn)行時(shí)不會(huì)打印NullPointerException異常,而是輸出"Hello world!",關(guān)鍵原因是:調(diào)用靜態(tài)方法時(shí)將忽略前面的調(diào)用對(duì)象或表達(dá)示,只與對(duì)象或表達(dá)式計(jì)算結(jié)果的類型有關(guān)。

?

在調(diào)用靜態(tài)方法時(shí),一定要使用類去調(diào)用,或是靜態(tài)導(dǎo)入后直接使用。


45.?循環(huán)中的不能聲明局部變量

Java代碼?? 收藏代碼
  1. for ?( int ?i?=? 0 ;?i?<? 1 ;?i++)???
  2. ?Object?o?;? //!!?編譯不能通過(guò) ??
  3. ??
  4. for ?( int ?i?=? 0 ;?i?<? 1 ;?i++)???
  5. ?Object?o?=? new ?Object();? //!!?編譯不能通過(guò) ??

?

一個(gè)本地變量聲明看起來(lái)像是一條語(yǔ)句,但是從技術(shù)上來(lái)說(shuō)不是。

?

Java語(yǔ)言規(guī)范不允許一個(gè)本地變量聲明語(yǔ)句作為一條語(yǔ)句在for、while或do循環(huán)中重復(fù)執(zhí)行。

?

一個(gè)本地變量聲明作為一條語(yǔ)句只能直接出現(xiàn)在一個(gè)語(yǔ)句塊中(一個(gè)語(yǔ)句塊是由一對(duì)花 括號(hào)以及包含在這對(duì)花括號(hào)中的語(yǔ)句和聲明構(gòu)成的):

Java代碼?? 收藏代碼
  1. for ?( int ?i?=? 0 ;?i?<? 1 ;?i++)?{??
  2. ?Object?o?=? new ?Object();? //?編譯OK ??
  3. }??

?

46.?內(nèi)部類反射

Java代碼?? 收藏代碼
  1. public ? class ?Outer?{??
  2. ? public ? class ?Inner?{??
  3. ?? public ?String?toString()?{??
  4. ??? return ? "Hello?world" ;??
  5. ??}??
  6. ?}??
  7. ? public ? void ?getInner()?{??
  8. ?? try ?{??
  9. ??? //?普通方式創(chuàng)建內(nèi)部類實(shí)例 ??
  10. ???System.out.println( new ?Outer(). new ?Inner()); //?Hello?world ??
  11. ??? //!!?反射創(chuàng)建內(nèi)部類,拋異常:java.lang.InstantiationException:Outer$Inner ??
  12. ???System.out.println(Inner. class .newInstance());??
  13. ??}? catch ?(Exception?e)?{??
  14. ??}??
  15. ?}??
  16. ? public ? static ? void ?main(String[]?args)?{??
  17. ??? new ?Outer().getInner();??
  18. ?}??
  19. }??

上面因?yàn)闃?gòu)造內(nèi)部類時(shí)外部類實(shí)例不存在而拋異常。

?

一個(gè)非靜態(tài)的嵌套類的構(gòu)造器,在編譯的時(shí)候會(huì)將一個(gè)隱藏的參數(shù)作為它的第一個(gè)參數(shù),這個(gè)參數(shù)表示它的直接外圍實(shí)例。如果使用反射創(chuàng)建內(nèi)部類,則要傳遞個(gè)隱藏參數(shù)的唯一方法就是使用java.lang.reflect.Constructor:

Java代碼?? 收藏代碼
  1. Constructor?c?=?Inner. class .getConstructor(Outer. class ); //獲取帶參數(shù)的內(nèi)部類構(gòu)造函數(shù) ??
  2. System.out.println(c.newInstance(Outer. this )); //反射時(shí)還需傳進(jìn)外圍類 ??

java解惑你知多少(六)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論