第一篇:黑馬程序員——IO(Input Output)流總結(jié)(二)
IO(Input Output)流總結(jié)
(二)剛開始觀看畢老師的視屏的時(shí)候,感覺一會(huì)兒輸出流,一會(huì)兒輸入流的,一會(huì)兒System.out,一會(huì)兒又轉(zhuǎn)換流的。很暈。
最后畢老師給了一個(gè)總結(jié),歸納出了IO操作的規(guī)律。感覺總結(jié)的非常好,雖然剛看第一遍的時(shí)候還是很暈,不過現(xiàn)在終于融匯貫通。
下面我就用自己的理解,總結(jié)一下IO流操作的一般規(guī)律:
在使用IO操作流之前,我們要問自己一下四個(gè)問題:
A.源和目的都有嗎?(初步確定體系)
B.源和目的操作的是字符嗎?(確定體系)
C.源和目的的設(shè)備都是些什么?(輔助確定具體對(duì)象)
D.需要提高輸入和輸出的效率嗎?
補(bǔ)充:源的設(shè)備:內(nèi)存,硬盤,鍵盤
目的的設(shè)備:內(nèi)存,硬盤,控制臺(tái)
當(dāng)明確了以上幾點(diǎn)之后我們就可以確定到底應(yīng)該使用那一個(gè)流對(duì)象。
Demo1:拷貝一個(gè)文本文件的副本。
分析:
A.源和目的都有。
所以,源可以選擇:Reader或者InputStream
目的可以選擇:Writer 或者 OutputStream
B.操作的都是字符數(shù)據(jù)。
所以,源應(yīng)該選擇:Reader
目的應(yīng)該選擇:Writer
C.源的設(shè)備是:硬盤。目的的設(shè)備是:硬盤。
所以:源應(yīng)該使用:FileReader
目的應(yīng)該使用:FileWriter
D.需要提高輸入和輸出效率。
所以可以使用相應(yīng)的裝飾類。
源使用:BufferedReader
目的使用:BufferedWriter
具體代碼如下:
BufferedReader bufr = new BufferedReader(new FileReader(“1.txt”));BufferedWriter bufw = new BufferedWriter(new FileWriter(“copy_1.txt”));
Demo2:將從鍵盤輸入的數(shù)據(jù)存儲(chǔ)到文件中。
分析:
A.源和目的都有。
所以,源可以選擇:Reader或者InputStream
目的可以選擇:Writer 或者 OutputStream
B.操作的都是字符數(shù)據(jù)。
所以,源應(yīng)該選擇:Reader
目的應(yīng)該選擇:Writer
C.源的設(shè)備是:鍵盤。目的的設(shè)備是:硬盤。
因?yàn)樵词擎I盤所以應(yīng)該使用System.in,但是鍵盤是字節(jié)流,但是我們使用的體系應(yīng)該是Reader(字符)體系的。所以要使用InputSreamReader(轉(zhuǎn)換流)將字節(jié)流轉(zhuǎn)換為字符流在進(jìn)行操作。目的應(yīng)該使用:FileWriter
D.需要提高輸入和輸出效率。
所以可以使用相應(yīng)的裝飾類。
源使用:BufferedReader
目的使用:BufferedWriter
具體代碼如下:
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter(“copy_1.txt”));
轉(zhuǎn)換流詳解:
查閱api我們知道轉(zhuǎn)換流是定義在字符體系中的,那么我們什么時(shí)候應(yīng)該使用轉(zhuǎn)換流呢?
InputStreamReader:是字節(jié)數(shù)據(jù)通向字符數(shù)據(jù)的橋梁。
當(dāng)我們要將字節(jié)數(shù)據(jù)轉(zhuǎn)換成字符數(shù)據(jù)時(shí)使用,在轉(zhuǎn)換成字符數(shù)據(jù)時(shí),我們必須指定字符編碼方式,如GB2312、UTF-8等
如果我們轉(zhuǎn)化的時(shí)候使用的編碼是系統(tǒng)默認(rèn)編碼,那么我們可以使用FileReader。其實(shí),F(xiàn)ileReader就是對(duì)編碼方式為系統(tǒng)默認(rèn)的轉(zhuǎn)換流(public InputStreamReader(InputStream in):創(chuàng)建一個(gè)使用默認(rèn)字符集的 InputStreamReader。)的一個(gè)封裝,這樣使用起來比較簡單。
OutputStreamWriter:是字符數(shù)據(jù)通向字節(jié)數(shù)據(jù)的橋梁。
當(dāng)創(chuàng)建使用指定字符集的 OutputStreamWriter 時(shí)使用。
簡單說就是,我們?nèi)绻敵鲆恍┪谋镜娇刂婆_(tái)上,那么我們知道控制臺(tái)的標(biāo)準(zhǔn)輸出流是System.out,是字節(jié)流,我們?cè)诓僮鲿r(shí),就要將字符數(shù)據(jù)轉(zhuǎn)化成字節(jié)數(shù)據(jù),這樣控制臺(tái)才能正確顯示,所以就用到了OutputStreamWriter。但是這個(gè)地方要注意,如果我們拿到一個(gè)文本他的編碼方式是UTF-8,但是你的電腦是簡體中文的。如果你在使用OutputStreamWriter的時(shí)候沒有指明轉(zhuǎn)換時(shí)使用的碼表,那么系統(tǒng)就會(huì)按照系統(tǒng)默認(rèn)的碼表轉(zhuǎn)換(一般是GBK)。這樣肯定會(huì)出問題了,所以,記住了!當(dāng)我們要指定編碼方式的時(shí)候就使用轉(zhuǎn)換流InputStreamReader和OutputStreamWriter。
Demo3:將從鍵盤輸入字符的數(shù)據(jù)顯示在屏幕上。
快速分析:
A.使用鍵盤,輸入流就是System.in,但是輸入的是字符,所以用到轉(zhuǎn)換流:InputStreamReader(System.in)
B.輸出到屏幕上,顧名思義就是控制臺(tái)。所以輸出流是System.out,因?yàn)槭俏谋据敵觯允褂肙utputStreamWriter(System.out)
C.如果要提高輸入輸出效率,就得使用裝飾類。
所以最終代碼如下:
BufferedReaderbufr=
newBufferedReader(new InputStreamReader(System.in));
BufferedWriterbufw=
newBufferedWriter(new OutputStreamWriter(System.out));
如果要求改為將鍵盤輸入的數(shù)據(jù)存入一個(gè)文件中,并按照UTF-8的編碼形式。
BufferedReaderbufr=
newBufferedReader(new InputStreamReader(System.in));
BufferedWriterbufw=
newBufferedWriter(new OutputStreamWriter
(new PrintStream(“TransDemo.txt”), “UTF-8”));
第二篇:黑馬程序員——IO(Input Output)流總結(jié)(一)
IO(Input Output)流總結(jié)
(一)IO流是處理數(shù)據(jù)之間數(shù)據(jù)傳輸?shù)摹?/p>
Java對(duì)數(shù)據(jù)的操作是通過流的方式。
Java中用于操作IO流的對(duì)象都放在java.io包中。
流的分類:按照操作數(shù)據(jù)分為:字符流和字節(jié)流。
按照流向分為:輸入流和輸出流。
輸入流:輸出流:
字符流:
ReaderWriter
|--BufferedReader|--BufferedWriter
|--inputStreamReader|--OutputStreamWriter
|--FileReader|--FileWriter
字節(jié)流:
InputStreamOutputStream
|--FileInputStream|--FileOutputStream
InputStreamOutputStream
|--FilterInputStream|--FilterOutputStream
|--BufferedInputStream|--BufferedOutputStream
在計(jì)算機(jī)中存儲(chǔ)的都是1和0的序列。也就是二進(jìn)制的有序序列,不論是文本、音樂或者是視頻。
那么為什么要在流中定義字節(jié)流和字符流呢?
這個(gè)與我們的字符編碼方式有關(guān)。我們都知道世界上有很多種的語言,比如:ASCII、GB2312、GBK、UTF-8和Unicode等。
如果一個(gè)文本文件使用GB2312編碼的方式存儲(chǔ)的,如果我們用Unicode的編碼方式來讀取,那么就會(huì)出現(xiàn)亂碼。所以字符流是一種特殊的流,在java中就定義了專門處理字符的流對(duì)象。
當(dāng)我們拿到一個(gè)API文檔我們應(yīng)該如何使用呢?
1,確定要使用的功能。
2,查閱API看有沒有相關(guān)的功能類。
3,如果沒有,就分析需要如何自定義一個(gè)出來,并且要使用到那些相關(guān)功能的類,這些類在API中有沒有定義。
4,不論有或者沒有需要自定義一個(gè),我們都要先查閱相關(guān)功能類的根類,那么查閱一個(gè)API的時(shí)候我們要注意一些什么呢?
5,找到相關(guān)功能根類,先看一下它是一個(gè)類,還是接口,還是抽象類,如果是接口或
者是抽象類我們就不能直接使用這個(gè)類,而要使用這個(gè)類的子類。
6,但是,我們不用急于先看它有哪些子類,我們先看一下它到底暴露了什么字段、構(gòu)造函數(shù)和方法。
7,在查看暴露的信息時(shí),我們要注意幾點(diǎn):
a.如果是static修飾的,說明是靜態(tài)的,我們不用new對(duì)象也可以直接使用。
b.我們要確定自己要使用的方法將會(huì)返回的數(shù)據(jù)的類型,是void呢、String呢、int呢、還是其他的。查找的時(shí)候就重點(diǎn)找返回這些類型的方法。(注意:如果我們使用的類是一個(gè)使用單例設(shè)計(jì)模式設(shè)計(jì)的,那么他就沒有構(gòu)造函數(shù),我們就一般可以通過靜態(tài)的getIstance()方法獲取相應(yīng)的對(duì)象,這時(shí)我們就要找返回值是對(duì)象類型的方法。)
8,如果在根類中找到了需要的方法,但是根類又不能創(chuàng)建對(duì)象,那么我們就看看,繼承這個(gè)根類的子類有哪些,一般子類都繼承了父類的方法,所以子類可以直接調(diào)用父類的方法,并且子類又定義了一些自身特別的方法。
9,找到需要的類創(chuàng)建對(duì)象,或者找到相關(guān)功能的對(duì)象自定義一個(gè)需要的類。
下面我們按照以上的方法來闡述IO流的學(xué)習(xí):
字節(jié)流:
字節(jié)流的根類有:讀取流(Reader)、寫入流(Writer)
根類都是abstract(抽象)的,我們不能直接創(chuàng)建對(duì)象,但是我們可以看一看父類都定義了什么方法。
Reader:
int read()
讀取單個(gè)字符。
int read(char[] cbuf)
將字符讀入數(shù)組。
abstractint read(char[] cbuf, int off, int len)
將字符讀入數(shù)組的某一部分。
intread(CharBuffer target)
試圖將字符讀入指定的字符緩沖區(qū)。
abstractvoid close()
關(guān)閉該流并釋放與之關(guān)聯(lián)的所有資源。
FileReader:Reader的子類,可以創(chuàng)建對(duì)象,專門用來操作字符數(shù)據(jù)流的。
Writer:
void write(char[] cbuf)
寫入字符數(shù)組。
abstractvoid write(char[] cbuf, int off, int len)
寫入字符數(shù)組的某一部分。
void write(int c)
寫入單個(gè)字符。
void write(String str)
寫入字符串。
void write(String str, int off, int len)
寫入字符串的某一部分。
abstractvoid close()
關(guān)閉此流,但要先刷新它。
abstractvoid flush()
刷新該流的緩沖。
寫入流(Writer)在每次調(diào)用write()方法的時(shí)候都要flush()(刷新)一次,當(dāng)然Writer也不能創(chuàng)建對(duì)象,我們可以使用他的子類FileWriter,F(xiàn)ileWriter是專門處理字符寫入流的類。
FileReader 和 FileWriter 為我們提供了操作字符數(shù)據(jù)流的一般方法,其中比較高效的就是自定義一個(gè)數(shù)組,用這個(gè)數(shù)組作為臨時(shí)存儲(chǔ)區(qū),每次讀取一塊(裝滿數(shù)組)數(shù)據(jù),然后再將這一塊數(shù)據(jù)寫入相應(yīng)的目的地。這樣就提高了效率,如果每次讀取一個(gè)字符然后寫入一個(gè)字符,就很低效,是不可取的。
自定一個(gè)數(shù)組為我們提高了效率,但是每次使用都要寫很多代碼,所以開發(fā)者就將這個(gè)數(shù)組封裝為了一個(gè)特殊的對(duì)象。那就是緩沖區(qū)!BufferedReader(字符讀取緩沖區(qū))和BufferedWriter(字符寫入緩沖區(qū))。他是用的是裝飾設(shè)計(jì)模式,是再不改變?cè)瓉硪讯x類的基礎(chǔ)上增強(qiáng)類的功能。
補(bǔ)充:BufferedReader的子類LineNumberReader,增加了int getLineNumber():獲得當(dāng)前行號(hào)的功能,我們可以在使用緩沖區(qū)的同時(shí)讀取行號(hào)。
裝飾設(shè)計(jì)模式:
當(dāng)想要對(duì)已有的對(duì)象進(jìn)行功能增強(qiáng)時(shí),可以定義類,將已有對(duì)象傳入,基于已有的功能,并提供加強(qiáng)功能。那么自定義的該類稱為裝飾類。
字符流學(xué)習(xí)完了,那么如果要學(xué)習(xí)字節(jié)流就會(huì)簡單很多,我們通過查閱API知道:很多方法都似曾相識(shí)。所以,總結(jié)一下就是下面幾點(diǎn):
A.字節(jié)流分為:InputStream(讀取流)和OutputStream(寫入流)
B.字節(jié)流和字符流的功能基本相同,只不過傳入的參數(shù)由字符流中的字節(jié)char,變成了字節(jié)中的byte。
C.字節(jié)流也具有緩沖區(qū):
BufferedInputStream(字節(jié)讀取緩沖區(qū))和BufferedOutputStream(字節(jié)寫入緩沖區(qū))。方法與字符緩沖區(qū)相似。
第三篇:黑馬程序員視頻總結(jié)
面向?qū)ο螅好嫦驅(qū)ο笫窍鄬?duì)于面向過程而言的。面向過程強(qiáng)調(diào)的是功能,面向?qū)ο髮⒐δ芊庋b進(jìn)對(duì)象,強(qiáng)調(diào)的是具有功能的對(duì)象。
類是對(duì)現(xiàn)實(shí)生活的描述。對(duì)象是一類事物實(shí)實(shí)在在存在的個(gè)體。
堆內(nèi)存和棧內(nèi)存:基本類型的變量和對(duì)象的引用存儲(chǔ)在棧內(nèi)存;用new創(chuàng)建的對(duì)象和數(shù)組存儲(chǔ)在堆內(nèi)存。
封裝:隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問方法。原則:將不需要對(duì)外提供的內(nèi)容都隱藏起來,將屬性都隱藏,提供公共方法對(duì)其訪問。好處:提高安全性,便于使用,提高重用性。
什么時(shí)候使用靜態(tài)?成員變量:當(dāng)對(duì)象中有共享數(shù)據(jù)時(shí)。成員函數(shù):函數(shù)內(nèi)部沒有訪問到非靜態(tài)數(shù)據(jù)(對(duì)象的特有數(shù)據(jù))。
幫助文檔制作:/***/@author作者;@version 版本;@param 參數(shù);@return 返回結(jié)果 命令:javadoc-d 文件夾-author-version xxx.java。將生成一系列網(wǎng)頁。
靜態(tài)代碼塊:static{}。用于給類進(jìn)行初始化,只執(zhí)行一次,優(yōu)先于主函數(shù)。
Person p=new Person():
1、找到Person.class加載到內(nèi)存。
2、執(zhí)行static代碼塊。
3、在棧內(nèi)存中開辟main()方法空間,并分配一個(gè) 變量p。
4、在堆內(nèi)存中開辟實(shí)體空間。
5、進(jìn)行屬性的空間分配,并進(jìn)行默認(rèn)初始化。
6、對(duì)空間屬性進(jìn)行顯示初始化。
7、實(shí)體的構(gòu)造代碼初始化。
8、調(diào)用對(duì)應(yīng)的構(gòu)造函數(shù),進(jìn)行構(gòu)造函數(shù)初始化。
9、將實(shí)體空間首地址賦給p。單例:
class Single{
private Single(){} //私有化構(gòu)造函數(shù)。
private static Single s = new Single();//靜態(tài)方法要訪問它,所以也要靜態(tài)化。靜態(tài)方法不能訪問非靜態(tài)的方法和屬性。創(chuàng)建私有并靜態(tài)的本類對(duì)象。
public static Single getInstance(){ //無法通過對(duì)象調(diào)用,只能是靜態(tài)。定義公有并靜態(tài)的方法,返回該對(duì)象。
return s;
}
}
//懶漢式:延遲加載方式。
class Single2{
private Single2(){}
private static Single2 s = null;
public static synchronized Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}
繼承:提高代碼復(fù)用性,并為多態(tài)打下基礎(chǔ)。Java只支持單繼承。多繼承隱患:多個(gè)父類定義相同功能時(shí),子類對(duì)象不確定要運(yùn)行哪一個(gè)。重載:方法名相同,但參數(shù)不同的多個(gè)同名函數(shù);
覆蓋:子類重寫父類的方法,要求方法名和參數(shù)類型完全一樣(參數(shù)不能是子類),返回值和異常比父類小或者相同(即為父類的子類),訪問修飾符比父類大或者相同
隱藏:父類和子類擁有相同名字的屬性或者方法時(shí),父類的同名的屬性或者方法形式上不見了,實(shí)際是還是存在的。
多態(tài):同一操作作用于不同的對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。
內(nèi)部類:內(nèi)部類可以直接訪問外部類的成員,包括私有。外部類必須建立內(nèi)部類對(duì)象才能訪問內(nèi)部類成員。
異常體系:error和exception
==和equals()的區(qū)別:“==”和“!=”比較的是“棧”中的內(nèi)容(對(duì)象的地址),而equals()比較的是“堆”中的內(nèi)容(對(duì)象的內(nèi)容)。
多線程:建立線程兩種方法:
1、繼承Thread類;
2、實(shí)現(xiàn)Runnable接口。繼承接口避免了單繼承的局限性。
線程對(duì)象.setDaemon(true)設(shè)置守護(hù)線程。線程啟動(dòng)前調(diào)用,當(dāng)正在運(yùn)行的線程只有守護(hù)線程時(shí),java虛擬機(jī)退出。
當(dāng)a線程執(zhí)行b線程的.join()方法時(shí),a會(huì)等待b線程執(zhí)行完才會(huì)執(zhí)行。
線程對(duì)象.setPriority()設(shè)置線程優(yōu)先級(jí)。
StringBuilder不是線程安全的,速度快;StringBuffer線程安全,慢。
泛型是一個(gè)類型安全機(jī)制,用于解決安全問題。
集合:
為方便存儲(chǔ)和操作對(duì)象,出現(xiàn)集合類。數(shù)組可以存儲(chǔ)對(duì)象,但長度固定,集合長度可變;數(shù)組可以存儲(chǔ)基本數(shù)據(jù)類型,集合只能存儲(chǔ)對(duì)象。
Collection:List和Set
List:有序,元素可以重復(fù),有索引。
ArrayList,底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組。查找速度快。刪除元素用equals()判斷
LinkList,鏈表,增刪速度快。
Vector。線程同步,數(shù)組,查找速度快。
Set:無序。元素唯一。
HashSet:底層數(shù)據(jù)結(jié)構(gòu)式哈希表。通過hashCode()和equals()方法保持唯一性。如果元素hashCode值相同才會(huì)判斷equals是否為true;
TreeSet:底層是二叉樹。可以對(duì)元素進(jìn)行排序。按自然順序就是compareTo()。
實(shí)現(xiàn)排序的兩種方法:
1、實(shí)現(xiàn)Comparable接口,覆蓋comapreTo(Object obj)方法。
2、實(shí)現(xiàn)Comparator接口,覆蓋compare(Object,Object)方法。
Map:
Hashtable,底層哈希表,不可以存儲(chǔ)null值或鍵。線程同步。效率低。
HashMap,哈希表,允許使用null值或鍵。不同步,效率高。
TreeMap。底層是二叉樹,線程不同步。可以給鍵進(jìn)行排序。
獲取Map元素的兩種方法:
1、Set
2、Set
Collections:java集合的工具類,用于操作集合類。
Arrays集合:用于操作數(shù)組的工具類。
1.5新特性:可變參數(shù),int...arr
靜態(tài)導(dǎo)入:import static java.lang.System.*;用于導(dǎo)入靜態(tài)方法;import java.lang.*;用于導(dǎo)入類文件。
System類:getProperties()方法獲得返回系統(tǒng)屬性Properties(Map集合子類)對(duì)象。Runtime類:運(yùn)行時(shí)操作類。單例設(shè)計(jì)模式。
Calendar類:抽象類,用getInstance()獲得對(duì)象。
Math類。
IO流:
常用基類:派生子類用父類名做后綴
字節(jié)流:InputStream,OutputStream
字符流:Reader,Writer
字符流:FileWriter,FileReader,需要flush();
字符流緩沖區(qū):BufferedReader,BufferedWriter;要結(jié)合流才能使用。需要flush(),關(guān)閉緩沖區(qū)就是關(guān)閉緩沖區(qū)的流對(duì)象。
LineNumberReader(FileReader)類,getLineNumber()方法可以獲得行號(hào)
字節(jié)流:FileOutputStream,F(xiàn)ileInputStream。操作多媒體文件。
轉(zhuǎn)換流:InputStreamReader,OutputStreamWriter。屬于字符流的子類。In(System.in),out返回字節(jié)流。
System.setIn(InputStream),System.setOut(PrintStream);改變標(biāo)準(zhǔn)輸入輸出。
File類:
合并流:SequenceInnputStream。用vector的elements()得到Enumeration。
切割文件:循環(huán)里邊創(chuàng)建流、關(guān)閉流。講一個(gè)文件分部分存儲(chǔ)在幾個(gè)文件中。
java.Awt:需要調(diào)用本地系統(tǒng)方法實(shí)現(xiàn)功能。
javax.Swing:完全由java實(shí)現(xiàn),增強(qiáng)移植性。
Component:
1、Container:Window,Panel
布局管理器:
1、FlowLayout,Panel默認(rèn)布局;
2、BorderLayout,F(xiàn)ram默認(rèn)。
TCP和UDP:TCP要經(jīng)過三次握手建立連接,傳輸大量數(shù)據(jù),可靠協(xié)議,效率低。UDP不需要建立連接,不可靠協(xié)議,速度快。
Socket:網(wǎng)絡(luò)服務(wù)的一種機(jī)制,網(wǎng)絡(luò)通信就是Socket間的通信,數(shù)據(jù)在兩個(gè)Socket間通信。TCP:Socket,ServerSocket
UDP:DatagramSocket,DatagramPacket
加強(qiáng):
overload:重載,存在于父類和子類、同類中。只能通過不同參數(shù)樣式重載。
override:重寫,存在于父類和子類之間。方法名、參數(shù)、返回值相同。子類方法不能縮小父類方法訪問權(quán)限。不能拋出更多異常。
可變參數(shù):int...arr
For循環(huán)增強(qiáng):for(int i:int[])
枚舉:讓某個(gè)變量的取值只能為若干個(gè)固定值中的一個(gè)。
反射:在運(yùn)行狀態(tài)能夠知道類的所有屬性和方法,并調(diào)用對(duì)象的任意一個(gè)方法。獲取類信息以及調(diào)用對(duì)象的方法。
類加載器:負(fù)責(zé)加載java類的字節(jié)碼到虛擬機(jī)中。每個(gè)類加載器加載類時(shí)先委托給其上級(jí)加載器,當(dāng)所有祖宗類加載器都沒有加載到類,回到發(fā)起者類加載器時(shí),還沒加載到類,拋出ClassNotFoundException異常。
JavaBean:有set和get方法獲得類屬性的特殊java類。用于傳遞數(shù)據(jù)信息。
內(nèi)省:IntroSpector,java語言對(duì)Javabean屬性、事件的一些缺省處理方法。
Beanutils工具包
注解:@Override表示當(dāng)前方法是覆蓋父類的方法。
@Deprecated表示當(dāng)前元素是不贊成使用的。
@SuppressWarnings 表示關(guān)閉一些不當(dāng)?shù)木幾g器警告信息。
Java系統(tǒng)默認(rèn)三個(gè)類加載器:BootStrap,ExtClassLoader,AppClassLoader
創(chuàng)建動(dòng)態(tài)類的實(shí)例對(duì)象:
1、通過實(shí)現(xiàn)的接口告訴要實(shí)現(xiàn)的動(dòng)態(tài)類要實(shí)現(xiàn)哪些方法。
2、產(chǎn)生的類的字節(jié)碼要有一個(gè)關(guān)聯(lián)的類加載器對(duì)象。
3、執(zhí)行代碼的對(duì)象InvocationHandler。
代理:用Proxy類的getProxyClass(classLoader,interface)獲得動(dòng)態(tài)類的字節(jié)碼文件。用反射獲得構(gòu)造器。用構(gòu)造器的newInstance()InvocationHandler接口的對(duì)象做參數(shù)獲得一個(gè)類對(duì)象。InvocationHandler對(duì)象重寫pubic Object invoke(Object proxy,Method method,Object
[] args)方法返回method.invoke(target,args)。
創(chuàng)建動(dòng)態(tài)代理對(duì)象步驟:
1、實(shí)現(xiàn)InvocationHandler 接口創(chuàng)建自己的調(diào)用處理器。重寫invoke方法。
2、用Proxy.newProxyInstance(classLoader,new Class[]{Interface.class},handler}方法獲得代理類實(shí)例。
Bank:
NumberManager類:產(chǎn)生客戶
Private int lastNumber;
Private List
int synchronized generateNewManager():產(chǎn)生新客戶號(hào)碼。客戶線程調(diào)用。
int synchronized fetchServiceNumber():取走客戶號(hào)碼。窗口線程調(diào)用。List是共享數(shù)據(jù)。需要互斥。
NumberMachine類:號(hào)碼管理器,采用單例設(shè)計(jì)模式
private NumberManager commonManager;用get()返回對(duì)象。
private NumberManager expressManager;用get()訪問。
private NumberManager vipManager;用get()訪問。
Enum CustomerType COMMON,EXPRESS,VIP;
ServiceWindow類:窗口
private int windowId;窗口號(hào)碼
enum CustomerType type;
public void start(){Executors.newSingleThreadExcutor().execute(new Runnable(){publicvoid run(){}})};根據(jù)type啟動(dòng)相應(yīng)的窗口服務(wù)。
MainClass:main()函數(shù)類
開啟5個(gè)普通窗口。
一個(gè)快速
一個(gè)vip
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(NewRunnable(){重寫run},0,1,TimeUnit.SECONDS)。
第四篇:【黑馬程序員】Java之debug總結(jié)二
【黑馬程序員濟(jì)南】Java之debug總結(jié)二
之前詳細(xì)描述了4種debug方式,現(xiàn)在簡紹第5種,不足之處,敬請(qǐng)指正:(源碼在文章末尾處)五.maven項(xiàng)目debug
第一步:首先創(chuàng)建一個(gè)maven項(xiàng)目,如圖所示:
第二步:debug運(yùn)行前設(shè)置
黑馬程序員濟(jì)南中心 編著
執(zhí)行完上面的步驟,會(huì)出現(xiàn)如下彈出框
黑馬程序員濟(jì)南中心 編著
Source配置如下
黑馬程序員濟(jì)南中心 編著
黑馬程序員濟(jì)南中心 編著
黑馬程序員濟(jì)南中心 編著
第三步:Debug運(yùn)行,上面配置完成后,直接debug運(yùn)行即可,如下圖
第四步:打斷點(diǎn)測(cè)試結(jié)果
黑馬程序員濟(jì)南中心 編著
希望能對(duì)不會(huì)使用maven進(jìn)行debug的猿友們有所幫助,第六種方式我會(huì)盡快補(bǔ)上
maven-debug.zip
黑馬程序員濟(jì)南中心 編著
第五篇:黑馬程序員自薦信
自薦信_(tái)XXX_151********
姓名:XXX
電話:151********
郵箱:********n2009@126.com
尊敬的老師:
你好,我叫XXX,今年24歲,就讀于XXXX,XXXX專業(yè),將于2012年畢業(yè)。性格稍內(nèi)向,善于交流,看待事情能夠理性認(rèn)識(shí),善于思考,有團(tuán)隊(duì)合作精神。在學(xué)校的這三年多的時(shí)間里,由于專業(yè)需要,對(duì)計(jì)算機(jī)接觸較多。在開設(shè)的課程中學(xué)過C語言、C#、java等編程語言,對(duì)編程語言有一定的了解。在接觸java程序語言和J2ME手機(jī)游戲開發(fā)的學(xué)習(xí)中,對(duì)java產(chǎn)生了強(qiáng)烈的興趣,并對(duì)java學(xué)習(xí)有了一定的基礎(chǔ)。通過“黑馬程序員訓(xùn)練營”的官網(wǎng),我了解到了javaee+3G課程體系所包含的知識(shí)面廣,是經(jīng)過對(duì)java前景分析和現(xiàn)在就業(yè)所需技術(shù)要求而制定的,對(duì)我們這些即將參加就業(yè)、想?yún)⒓觠ava方面工作的人來說是最好的強(qiáng)心劑。課程安排科學(xué)合理,有助于學(xué)員深化對(duì)java的學(xué)習(xí),使學(xué)員掌握到真正前沿的技術(shù)。我深信,“黑馬程序員訓(xùn)練營”的講師是java培訓(xùn)和開發(fā)方面最棒的,這也是我鐘情于“黑馬程序訓(xùn)練營”的原因之一。由于家里生活拮據(jù),不想讓父母操心、給家里增加經(jīng)濟(jì)負(fù)擔(dān),是“黑馬程序員”給了我一個(gè)機(jī)會(huì)、給了我一份保證。
作為一名理科生,我有著很強(qiáng)的求知欲,勤奮,有上進(jìn)心,對(duì)于堅(jiān)信的事情能夠堅(jiān)持到底。在平時(shí)學(xué)習(xí)過程中,善于獨(dú)立思考,遇到問題會(huì)嘗試各種方法去解決(網(wǎng)絡(luò)、老師、同學(xué)都是我的獲得知識(shí)的途徑)。平時(shí)喜歡看一些和自己專業(yè)的書籍,樂于了解一些最前沿的科技和未來的發(fā)展趨勢(shì)。注重的基礎(chǔ)知識(shí)的同時(shí),喜歡探索新知識(shí),在收獲知識(shí)的同時(shí)也收獲著樂趣。學(xué)習(xí)是一輩子的事情,也是一件樂事,就算將來學(xué)校的生活結(jié)束了,學(xué)習(xí)也永遠(yuǎn)不會(huì)落下。
我非常期待能成為“黑馬程序員訓(xùn)練營”的一員,如果這個(gè)愿望能實(shí)現(xiàn),我將以最大的熱情投入到“黑馬程序員訓(xùn)練營”的學(xué)習(xí)中去,用自己的努力去實(shí)現(xiàn)的自身價(jià)值,用自己的成績回報(bào)“黑馬程序員訓(xùn)練營”。我堅(jiān)定工作后的第一件事就是努力工作,用工資償還培訓(xùn)期間的費(fèi)用,絕不辜負(fù)“黑馬程序員訓(xùn)練營”對(duì)我的信任和老師的培養(yǎng)!請(qǐng)給我一份信任,我將以自己的自己的行動(dòng)去回報(bào)。
擇是我的期望,給我一次機(jī)會(huì)還你一份驚喜。
非常感激你能在百忙之中翻閱我的自薦信。祝你工作順利,事業(yè)蒸蒸日上!
此致
敬禮
自薦人:XXX
2012年02月17號(hào)