?
- 每個(gè)實(shí)例擁有一個(gè)實(shí)例變量;每種類別之下共享一個(gè)靜態(tài)變量。
- 編譯器會(huì)處理除RuntimeException外的所有Exception。
- try...catch...finally中,finally無論如何都會(huì)被最后執(zhí)行。即使try & catch 內(nèi)含有return,程序也會(huì)在return前先執(zhí)行finally
- try...catch中,如果有多個(gè)同父類(除Exception外)的Exception,catch Exception的順序從上到下應(yīng)該是子類->父類。否則父類的Exception處理會(huì)掩蓋了子類的Exception處理。
-
在一個(gè)方法中,如果出現(xiàn)Exception,并處理了該Exception后,沒有重新throw該Exception,則try...catch...finally外的代碼還會(huì)繼續(xù)被執(zhí)行。這會(huì)對(duì)程序產(chǎn)生災(zāi)難性影響的。
public static void main(String[] arg) { String key = "yes"; try { midlefun(key); } catch (Exception e) { e.printStackTrace(); } System.out.println("end of main"); } static void midlefun(String key) throws Exception { try { System.out.println("start try"); doRisky(key); System.out.println("end try"); } catch (Exception e) { System.out.println("Exception from midlefun"); // throw new Exception(); //如果注釋這一條,"end of midlefun"就會(huì)被打印出來 } finally { System.out.println("finally"); } System.out.println("end of midlefun"); } static void doRisky(String key) throws Exception{ System.out.println("start risky"); if("yes".equals(key)) { throw new Exception(); } System.out.println("end risky"); return ; }
? - 方法中的Exception應(yīng)該要自己處理,如果還需要調(diào)用者對(duì)該異常也做出反應(yīng),則需要再throw出來。
-
Java 的輸入 / 輸出 API 帶有鏈接類型的串流,它代表來源與目的地之間的連接,連接串流將串流與其他串流連接起來。例如: PipedOutputStream 。
一般來講,串流要兩兩連接才能做出有意義的事情 — 其中一個(gè)表示連接,另一個(gè)則是要被調(diào)用方法的。由于 Java 中有豐富的輸入 / 輸出流,只要配合起來就可以完成各種任務(wù),達(dá)到最大的實(shí)用性!
下面的圖是一個(gè)演示。保存 java 的對(duì)象到一個(gè)文件中。
-
內(nèi)部類對(duì)外部類有特權(quán),可以自由地存取它的內(nèi)容,就算是私有的內(nèi)容也一樣。內(nèi)部類可以把外部的方法或變量當(dāng)作是自己的。例如:
public class MyOuter { private int x; public int getX() { return x; } class MyInner{ void go() { x = 42; //調(diào)用外部類的私有對(duì)象 } } MyInner inner = new MyInner(); //初始化內(nèi)部類 public void doStuff() { inner.go(); } public static void main(String[] arg) { MyOuter outer = new MyOuter(); System.out.println(outer.getX()); outer.doStuff(); System.out.println(outer.getX()); } }
?如果需要在外部類中生成內(nèi)部類變量,則需要首先生成外部類對(duì)象。這是由于內(nèi)部類對(duì)外部類的那個(gè)特權(quán)決定的。public static void main(String[] arg) { MyOuter outer = new MyOuter(); System.out.println(outer.getX()); MyOuter.MyInner inner = outer.new MyInner(); inner.go(); System.out.println(outer.getX()); }
?內(nèi)部類一般是在GUI程序中使用比較多。添加ActionListener的時(shí)候。 -
線程(Thread)
? ~線程啟動(dòng)需要有一個(gè)Runnable對(duì)象。
? ~線程有三個(gè)狀態(tài):1.新建(Thread thread = new Thread(runnable););2.可執(zhí)行(thread.start(););3.執(zhí)行中(何時(shí)被執(zhí)行由java虛擬機(jī)來管理,你無法干預(yù)。并且多線程運(yùn)行中,多個(gè)任務(wù)會(huì)被交替執(zhí)行,而不是一個(gè)一個(gè)的被執(zhí)行);4.堵塞(因?yàn)門hread可能在等待其他程序的回復(fù))。
? ~由于多個(gè)Thread由虛擬機(jī)來管理交替執(zhí)行,PS:main函數(shù)也是一個(gè)Thread,其被執(zhí)行的順序都是我們無法預(yù)測的。例如下面的代碼:public static void main( String[] args ) { System.out.println("start"); Thread myThread = new Thread(new Runnable() { @Override public void run() { System.out.println("in thread"); } }); myThread.start(); System.out.println("back to main"); }
?并不是每次都能夠得到下列輸出的:
? start
? back to main
? in thread
? 有可能得到下面的輸出:
? start
? in thread
? back to main
?
? 這要看虛擬機(jī)開心不開心了。^_^
? ~當(dāng)某個(gè)runnable任務(wù)對(duì)某個(gè)狀態(tài)敏感,且多個(gè)Thread都會(huì)操作該狀態(tài)時(shí),就會(huì)產(chǎn)生競爭。這時(shí)候可以在 操作該狀態(tài)的方法 上,增加修飾符synchronized,以達(dá)到加鎖的目的。
? ~無論synchronized關(guān)鍵字加在方法上還是對(duì)象上,它取得的鎖都是對(duì)象,而不是把一段代碼或函數(shù)當(dāng)作鎖――而且同步方法很可能還會(huì)被其他線程的對(duì)象訪問。
? ~每個(gè)對(duì)象只有一個(gè)鎖(lock)與之相關(guān)聯(lián)。
? ~實(shí)現(xiàn)同步是要很大的系統(tǒng)開銷作為代價(jià)的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。 - 待續(xù)
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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