欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

java解惑你知多少(六)

系統 1888 0

41.?instanceof與轉型

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

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

?

如果instanceof告訴你一個對象引用是某個特定類型的實例,那么你就可以將其轉型為該類型,并調用該類型的方法

,而不用擔心會拋出ClassCastException或NullPointerException異常。

?

instanceof操作符有這樣的要求:左操作數要是一個對象的或引用,右操作數是一個引用類型,并且這兩個操作數的

類型是要父子關系(左是右的子類,或右是左的子類都行),否則編譯時就會出錯。


42.?父類構造器調用已重寫的方法

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. ?? //?這里實質上是調用子類被重寫的方法 ??
  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. }??

?

在一個構造器調用一個已經被其子類重寫了的方法時,可能會出問題:如果子類重寫的方法要訪問的子類的域還未初

始化,因為這種方式被調用的方法總是在實例初始化之前執行。要想避免這個問題,就千萬不要在父類構造器中調用

已重寫的方法。


43.?靜態域與靜態塊的初始順序

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. }??

上面的結果不是1,而是0,為什么?

?

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


44.?請使用引用類型調用靜態方法

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. }??

上面程序運行時不會打印NullPointerException異常,而是輸出"Hello world!",關鍵原因是:調用靜態方法時將忽略前面的調用對象或表達示,只與對象或表達式計算結果的類型有關。

?

在調用靜態方法時,一定要使用類去調用,或是靜態導入后直接使用。


45.?循環中的不能聲明局部變量

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

?

一個本地變量聲明看起來像是一條語句,但是從技術上來說不是。

?

Java語言規范不允許一個本地變量聲明語句作為一條語句在for、while或do循環中重復執行。

?

一個本地變量聲明作為一條語句只能直接出現在一個語句塊中(一個語句塊是由一對花 括號以及包含在這對花括號中的語句和聲明構成的):

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

?

46.?內部類反射

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. ??? //?普通方式創建內部類實例 ??
  10. ???System.out.println( new ?Outer(). new ?Inner()); //?Hello?world ??
  11. ??? //!!?反射創建內部類,拋異常: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. }??

上面因為構造內部類時外部類實例不存在而拋異常。

?

一個非靜態的嵌套類的構造器,在編譯的時候會將一個隱藏的參數作為它的第一個參數,這個參數表示它的直接外圍實例。如果使用反射創建內部類,則要傳遞個隱藏參數的唯一方法就是使用java.lang.reflect.Constructor:

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

java解惑你知多少(六)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 有一婷婷色 | 狠狠五月深爱婷婷网免费 | 成人午夜视频网站 | 国产日韩一区在线精品欧美玲 | 国产成人综合在线 | 欧美性一区二区三区 | 天天草人人草 | 午夜欧美一区二区三区在线播放 | www.国产精| 欧美视频观看 | 欧美激情欧美激情在线五月 | 一区二区在线不卡 | 午夜在线影院 | 狠狠干伊人 | 色人阁在线| 91中文字幕在线一区 | 欧美在线亚洲 | 国产成人综合一区二区三区 | 日韩在线操 | 国产精品热 | 久草在线视频中文 | 精品国产不卡一区二区三区 | 一区二区日韩 | 欧美中文字幕一区二区三区亚洲 | 免费能直接在线观看黄的视频 | 国产视频中文字幕 | 欧美精品在线一区 | 国产伦理久久精品久久久久 | 欧美地区一二三区 | 一级毛片免费看 | 欧美精品1区2区3区 国产午夜精品理论片影院 亚洲精品不卡久久久久久 三级网站免费观看 | 免费一级在线 | 欧美日韩精品一区三区 | 色五月丁香五月综合五月 | 国产精品精品 | 6080伦理久久亚洲精品 | 美女污视频网站 | 成人亚洲视频 | 日日骚视频 | 香港三级日本三级人妇网站 | 精品久久久久久亚洲综合网 |