北京圣思園java課堂筆記_第1頁
北京圣思園java課堂筆記_第2頁
北京圣思園java課堂筆記_第3頁
北京圣思園java課堂筆記_第4頁
北京圣思園java課堂筆記_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余52頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1 .類是一種抽象的概念,對(duì)象是類的一種具體表示形式,是具體的概念。先有類,然后由類來生成對(duì)象(Object)。對(duì)象又叫做實(shí)例(Instance)。2 .類由兩大部分構(gòu)成:屬性以及方法。屬性一般用名詞來表示,方法一般用動(dòng)詞來表示。3 .如果一個(gè)java源文件中定義了多個(gè)類,那么這些類中最多只能有一個(gè)類是public的,換句話說,定義的多個(gè)類可以都不是public的。4 .在Java中進(jìn)行方法的參數(shù)傳遞時(shí),無論傳遞的是原生數(shù)據(jù)類型還是引用類型,參數(shù)傳遞方式統(tǒng)一是傳值(passbyvalue)。Java中沒有傳引用(passbyreference)的概念。5 .方法重載(Overload)。表示兩

2、個(gè)或多個(gè)方法名字相同,但方法參數(shù)不同。方法參數(shù)不同有兩層含義:1)參數(shù)個(gè)數(shù)不同。2)參數(shù)類型不同。注意:方法的返回值對(duì)重載沒有任何影響。6 .構(gòu)造方法重載:只需看參數(shù)即可。如果想在一個(gè)構(gòu)造方法中調(diào)用另外一個(gè)構(gòu)造方法,那么可以使用this()的方式調(diào)用,this()括號(hào)中的參數(shù)表示目標(biāo)構(gòu)造方法的參數(shù)。this()必須要作為構(gòu)造方法的第一條語句,換句話說,this()之前不能有任何可執(zhí)行的代碼。7 .繼承(Inheritence):Java是單繼承的,意味著一個(gè)類只能從另一個(gè)類繼承(被繼承的類叫做父類【基類,baseclass,繼承的類叫做子類),Java中的繼承使用extends關(guān)鍵字。8 .當(dāng)

3、生成子類對(duì)象時(shí),Java默認(rèn)首先調(diào)用父類的不帶參數(shù)的構(gòu)造方法,然后執(zhí)行該構(gòu)造方法,生成父類的對(duì)象。接下來,再去調(diào)用子類的構(gòu)造方法,生成子類的對(duì)象。【要想生成子類的對(duì)象,首先需要生成父類的對(duì)象,沒有父類對(duì)象就沒有子類對(duì)象。比如說:沒有父親,就沒有孩子】。9 .super關(guān)鍵字:super表示對(duì)父類對(duì)象的引用。10 .如果子類使用super()顯式調(diào)用父類的某個(gè)構(gòu)造方法,那么在執(zhí)行的時(shí)候就會(huì)尋找與super()所對(duì)應(yīng)的構(gòu)造方法而不會(huì)再去尋找父類的不帶參數(shù)的構(gòu)造方法。與this一樣,super也必須要作為構(gòu)造方法的第一條執(zhí)行語句,前面不能有其他可執(zhí)行語句。11 .關(guān)于繼承的3點(diǎn):a)父類有的,子類也

4、有b)父類沒有的,子類可以增加c)父類有的,子類可以改變12 .關(guān)于繼承的注意事項(xiàng)a)構(gòu)造方法不能被繼承b)方法和屬性可以被繼承c)子類的構(gòu)造方法隱式地調(diào)用父類的不帶參數(shù)的構(gòu)造方法d)當(dāng)父類沒有不帶參數(shù)的構(gòu)造方法時(shí),子類需要使用super來顯式地調(diào)用父類的構(gòu)造方法,super指的是對(duì)父類的引用e)super關(guān)鍵字必須是構(gòu)造方法中的第一行語句。13 .方法重寫(Override):又叫做覆寫,子類與父類的方法返回類型一樣、方法名稱一樣,參數(shù)一樣,這樣我們說子類與父類的方法構(gòu)成了重寫關(guān)系。14 .方法重寫與方法重載之間的關(guān)系:重載發(fā)生在同一個(gè)類內(nèi)部的兩個(gè)或多個(gè)方法。重寫發(fā)生在父類與子類之間。15

5、.當(dāng)兩個(gè)方法形成重寫關(guān)系時(shí),可以在子類方法中通過super.run()形式調(diào)用父類的run()方法,其中super.run()不必放在第一行語句,因此此時(shí)父類對(duì)象已經(jīng)構(gòu)造完畢,先調(diào)用父類的run()方法還是先調(diào)用子類的run()方法是根據(jù)程序的邏輯決定的。16 .在定義一個(gè)類的時(shí)候,如果沒有顯式指定該類的父類,那么該類就會(huì)繼承于java.lang.Object類(JDKl供的一個(gè)類,Object類是Java中所有類的直接或間接父類)。17 .多態(tài)(Polymorphism):我們說子類就是父類(玫瑰是花,男人是人),因此多態(tài)的意思就是:父類型的引用可以指向子類的對(duì)象。1. 多態(tài):父類型的引用可

6、以指向子對(duì)象。2. Parentp=newChild();當(dāng)使用多態(tài)方式調(diào)法時(shí),首先檢查父類中是否有ssing()方法,3. 一共有兩種類型的強(qiáng)制轉(zhuǎn)換:a)向上類型轉(zhuǎn)換(向上類型轉(zhuǎn)換(upcastupcastupcastupcastupcast):比如說將):比如說將):比如說將CatCat類型轉(zhuǎn)換為AnimalAnimal類型,即將子類型,即將子轉(zhuǎn)換為父類型。對(duì)于向上,不需要顯式指定b)向下類型轉(zhuǎn)換(向下類型轉(zhuǎn)換(downcastdowncastdowncastdowncastdowncastdowncastdowncast):比如將):比如將):對(duì)于向下,必須要顯式指定轉(zhuǎn)換為子類型。對(duì)4

7、.抽象類(抽象類(abstractclass):使用了abstract關(guān)鍵字所修飾的類叫做抽象。抽象類無法實(shí)例化,也就是說不能newnew出來一個(gè)抽象類的對(duì)(實(shí)例)。5 .抽象方法(abstractmeth):使用abstractt關(guān)鍵字所修飾的方法叫做抽方法之前所定義的叫。相對(duì)于抽象方法,之前所定義的叫。相對(duì)于抽象方法,之前所定義的叫做具體方法(有聲明,實(shí)現(xiàn))。6 .如果一個(gè)類包含了抽象方法,那么這定是抽象類。7 .如果某個(gè)類是抽象,那么該可以包含具體方法(有聲明、實(shí)現(xiàn))。如果某個(gè)類是抽象,那么該可以包含具體方法(有聲明、實(shí)現(xiàn))。8 .如果一個(gè)類中包含了抽象方法,那么這定要聲明成abstra

8、ctclass也就是說,該類一定抽象;反之如果某個(gè)該類包含抽象方法,9 .無論何種情況,只要一個(gè)類是抽象那么這就法實(shí)例化。10 .在子類繼承父(是個(gè)抽象)的情況下,那么該子類必須要實(shí)現(xiàn)中所定義的所有抽象方法;否則,該子類需要聲明成一個(gè)abstractclass。11 .接口(interface):接口的地位等同于接口的地位等同于class,接口中的所有方法都是抽象方法。在聲明接口中的方法時(shí),可以使用abstract關(guān)鍵字,也可以不使用。通常情況下,都會(huì)省略掉abstract關(guān)鍵字。12 .可以將接口看作是特殊的抽象類(類中沒有具體方法,13 .類可以實(shí)現(xiàn)接口。實(shí)現(xiàn)使用關(guān)鍵字實(shí)現(xiàn)使用關(guān)鍵字imp

9、lements表示某個(gè)類實(shí)現(xiàn)某個(gè)接口。14 .一個(gè)類實(shí)現(xiàn)了某接口,那么該類必須要實(shí)現(xiàn)接口中聲明的所有方法。如果一15 .Java是單繼承的,也就說某個(gè)類只能有唯一父;可以實(shí)現(xiàn)多個(gè)接口,多之間使用逗號(hào)分隔。16 .多態(tài):所謂,就是父類型的引用可以指向子對(duì)象或者類例。關(guān)于接口與實(shí)現(xiàn)的類之間強(qiáng)制類型之間的強(qiáng)完全一樣。17 .static關(guān)鍵字:可以用于修飾屬性,也方法還可以用于修飾屬性,也方法還類(后面的課程講)18 .statictatictatictatic修飾屬性:無論一個(gè)類生成了多少對(duì)象,所有這些共同使用唯一份靜態(tài)的成員變量;值也會(huì)隨之發(fā)生化。如果一個(gè)成員變量是staticc的,那么我們可以

10、通過類名.成員變量名的方式來使用它19 .staticstaticstaticstaticstatic修飾方法:static修飾的方法叫做靜態(tài)。對(duì)于靜態(tài)方法來說,可以使用類名.方法名的方式來訪問。20 .靜態(tài)方法只能繼承,不重寫(Override)。21 .final關(guān)鍵字:final可以修飾屬性、方法,類。22 .final修飾類:當(dāng)一個(gè)類被final所修飾時(shí),表示該類是一個(gè)終態(tài)即不能被繼承。23 .final修飾方法:當(dāng)一個(gè)方法被finall所修飾時(shí),表示該方法是一個(gè)終態(tài)所修飾時(shí),表示該方法是一個(gè)終態(tài)即不能被重寫(Override)。24 final修飾屬性:當(dāng)一個(gè)屬性被當(dāng)一個(gè)屬性被fin

11、al所修飾時(shí),表示該屬性不能被改寫。25 .當(dāng)final修飾一個(gè)原生數(shù)據(jù)類型時(shí),表示該的值不能發(fā)變化(比如說不能從10變?yōu)?0);如果final修飾一個(gè)引用類型時(shí),該引用不能再指向其他對(duì)象了,但該引用所的內(nèi)容是可以發(fā)生變化26 .對(duì)于final類型成員變量,一般來說有兩種賦初值方式:a)在聲明finalfinalfinal類型的成員變量時(shí)就賦上初值b)在聲明final類型的成員變量時(shí)不賦初值,但在所有構(gòu)造方法中都為其類型的成員變量賦初值,27 .staticc代碼塊:靜態(tài)代碼塊作用是完成一些初始化工。在類被加載的時(shí)候先執(zhí)行靜態(tài)代碼塊,而構(gòu)造方法是在生成對(duì)象的時(shí)候執(zhí)行;要想調(diào)用某個(gè)類來,首先需而

12、構(gòu)造方法是在生成對(duì)象的時(shí)候執(zhí)行;30 .不能在靜態(tài)方法中訪問非成員變量,可以在非靜態(tài)方法中訪問靜態(tài)成員變量和非靜態(tài)成員變量,;31 .總結(jié):靜態(tài)的只能訪問;非可以一切。32 .不能在靜態(tài)方法中使用this關(guān)鍵字。1 .接口中所聲明的方法都是抽象方法。接口中的方法都是public的。2 .接口中也可以定義成員變量。接口中的成員變量都是public、final、static的。3 .一個(gè)類不能既是final,又是abstract的。因?yàn)閍bstract的主要目的是定義一種約定,讓子類去實(shí)現(xiàn)這種約定,而final表示該類不能被繼承,這樣abstract希望該類可以被繼承而final明確說明該類不能被

13、繼承,兩者矛盾。因此一個(gè)類不能既是final的,又是abstract的。4 .DesignPattern(設(shè)計(jì)模式)。單例模式(Singleton):表示一個(gè)類只會(huì)生成唯一的一個(gè)對(duì)象。5 .包(package)。用于將完成不同功能的類分門別類,放在不同的目錄(包)下。包的命名規(guī)則:將公司域名反轉(zhuǎn)作為包名。,com.shengsiyuan(包名),對(duì)于包名:每個(gè)字母都需要小寫。如果定義類的時(shí)候沒有使用package,那么Java就認(rèn)為我們所定義的類位于默認(rèn)包里面(defaultpackage)。6 .編譯帶有package聲明的Java源文件有兩種方式:a)直接編譯,然后根據(jù)類中所定義的包名,逐

14、一手工建立目錄結(jié)構(gòu),最后將生成的class文件放到該目錄結(jié)構(gòu)中(很少使用,比較麻煩)。b)使用編譯參數(shù)-d,方式為javac-d.源文件.java,這樣在編譯后,編譯器會(huì)自動(dòng)幫助我們建立好包所對(duì)應(yīng)的目錄結(jié)構(gòu)。7 .有兩個(gè)包名,分別是aa.bb.cc與aa.bb.cc.dd,那么我們稱后者為前者的子包。8 .導(dǎo)入(import),將使用package分離的各個(gè)類導(dǎo)入回來,讓編譯器能夠找到所需要的類。9 .import的語法:importcom.shengsiyuan.PackageTest;10 .importcom.shengsiyuan.*,表示導(dǎo)入com.shengsiyuan包下面的所有

15、類。11 .importaa.bb.*并不會(huì)導(dǎo)入aa.bb.cc包下面的類。這時(shí)需要這樣寫:importaa.bb.*;importaa.bb.cc.*;12 .關(guān)于package、import、class的順序問題:a)首先需要定義包(package),可選b)接下來使用import進(jìn)行導(dǎo)入,可選c)然后才是class或interface的定義。13 .如果兩個(gè)類在同一個(gè)包下面,那么則不需要導(dǎo)入,直接使用即可。14 .訪問修飾符(accessmodifier)。1) public(公共的):被public所修飾的屬性和方法可以被所有類訪問。2) protected(受保護(hù)的):被protec

16、ted所修飾的屬性和方法可以在類內(nèi)部、相同包以及該類的子類所訪問。3) private(私有的):被private所修飾的屬性和方法只能在該類內(nèi)部使用4)默認(rèn)的(不加任何訪問修飾符):在類內(nèi)部以及相同包下面的類所使用。15. instanceof:判斷某個(gè)對(duì)象是否是某個(gè)類的實(shí)例。語法形式:引用名instanceof類名(接口名),返回一個(gè)boolean值。16. Peoplepeople=newMan();17. System.out.println(peopleinstanceofPeople);/結(jié)果為true,因?yàn)镸an是People的子類,根據(jù)繼承,子類就是父類,因此Ma也可以看作是P

17、eople的實(shí)例。18. 相等性的比較(=)1)對(duì)于原生數(shù)據(jù)類型來說,比較的是左右兩邊的值是否相等。2)對(duì)于引用類型來說,比較左右兩邊的引用是否指向同一個(gè)對(duì)象,或者說左右兩邊的引用地址是否相同。19 .java.lang.Object類。java.lang包在使用的時(shí)候無需顯式導(dǎo)入,編譯時(shí)由編譯器自動(dòng)幫助我們導(dǎo)入。20 .API(ApplicationProgrammingInterface),應(yīng)用編程接口。21 .當(dāng)打印引用時(shí),實(shí)際上會(huì)打印出引用所指對(duì)象的toString()方法的返回值,因?yàn)槊總€(gè)類都直接或間接地繼承自O(shè)bject,而Object類中定義了toString(),因此每個(gè)類都有

18、toString()這個(gè)方法。22 .關(guān)于進(jìn)制的表示:16進(jìn)制,逢16進(jìn)一,16進(jìn)制的數(shù)字包括:09,A,B,C,D,E,F,23.equals()方法,該方法定義在Object類當(dāng)中,因此Java中的每個(gè)類都具有該方法,對(duì)于Object類的equals()方法來說,它是判斷調(diào)用equals()方法的引用與傳進(jìn)來的引用是否一致,即這兩個(gè)引用是否指向的是同一個(gè)對(duì)象。對(duì)于Object類的equals()方法來說,它等價(jià)于=。24. 對(duì)于String類的equals()方法來說,它是判斷當(dāng)前字符串與傳進(jìn)來的字符串的內(nèi)容是否一致。25. 對(duì)于String對(duì)象的相等性判斷來說,請(qǐng)使用equals()方法

19、,而不要使用=。26. String是常量,其對(duì)象一旦創(chuàng)建完畢就無法改變。當(dāng)使用訓(xùn)接字符串時(shí),會(huì)生成新的String對(duì)象,而不是向原有的String對(duì)象追加內(nèi)容。27. StringPool(字符串池)28. Strings="aaa”;(采用字面值方式賦值)1)查找StringPool中是否存在“aaa”這個(gè)對(duì)象,如果不存在,則在StringPool中創(chuàng)建一個(gè)“aaa”對(duì)象,然后將StringPool中的這個(gè)“aaa”對(duì)象的地址返回來,賦給引用變量s,這樣s會(huì)指向StringPool中的這個(gè)“aaa”字符串對(duì)象2)如果存在,則不創(chuàng)建任何對(duì)象,直接將StringPool中的這個(gè)“aa

20、a”對(duì)象地址返回來,賦給s引用。29. Strings=newString(“aaa”);1)首先在StringPool中查找有沒有“aaa”這個(gè)字符串對(duì)象,如果有,則不在StringPool中再去創(chuàng)建“aaa”這個(gè)對(duì)象了,直接在堆中(heap)中創(chuàng)建一個(gè)“aaa”字符串對(duì)象,然后將堆中的這個(gè)“aaa”對(duì)象的地址返回來,賦給s引用,導(dǎo)致s指向了堆中創(chuàng)建的這個(gè)“aaa”字符串對(duì)象。2)如果沒有,則首先在StringPool中創(chuàng)建一個(gè)“aaa”對(duì)象,然后再在堆中(heap)創(chuàng)建一個(gè)"aaa“對(duì)象,然后將堆中的這個(gè)"aaa“對(duì)象的地址返回來,賦給s引用,導(dǎo)致s指向了堆中所創(chuàng)建的這

21、個(gè)“aaa”對(duì)象。北京圣思園科技有限公司版權(quán)所有JavaSELesson41 .包裝類(包裝類(WrapperClass)。針對(duì)于原生數(shù)據(jù)類型的所有的包裝類(8個(gè))者B位于java.langjava.langj包下。JavaJ中的8個(gè)包裝類分別是:個(gè)包裝類分別是:個(gè)包裝類分別是:個(gè)包裝類分別是:Byte,Short,Integer,Long,Float,Double,BooleanCharacter,。他們的使用方式都是一樣,可以實(shí)現(xiàn)原生數(shù)據(jù)類型與包裝類的雙向轉(zhuǎn)換。2 .數(shù)組(Array):相同類型數(shù)據(jù)的集合就叫做數(shù)組。3 .如何定義數(shù)組。type口變量名=newtype口數(shù)組中元素的個(gè)數(shù);可

22、以按照下列方式定義長度為10的數(shù)組:int口a=newint10;4 .數(shù)組中的元素索引是從0開始的。對(duì)于數(shù)組來說,最大索引=數(shù)組的長度-1。5 .定義數(shù)組的3種方式:type口變量名=newtype逗號(hào)分隔的初始化值列表;6 .Java中的每個(gè)數(shù)組都有長度,數(shù)組長度一旦確定,就不能改變大小。7 .int口a=newint10其中a是一個(gè)引用,它指向了生成的數(shù)組對(duì)象首地址是一個(gè)引用,每個(gè)元素都是int類型,其中僅存放數(shù)據(jù)值本身。北京圣思園科技有限公司版權(quán)所有8 .二維數(shù)組是一種平面的結(jié)構(gòu),二維數(shù)組的定義方式:type叩a=newtype23;9 .三維數(shù)組。type叩口a=newtype234

23、;10 .冒泡排序。(掌握交換,快速的原理與實(shí)現(xiàn)方式)11 .二分查找(BinarySearch):待查找的數(shù)組要有序。1 .對(duì)于Java中的常量的命名規(guī)則:所有單詞的字母都是大寫,如果有多個(gè)單詞,那么使用下劃線連接即可。比如說:publicstaticfinalintAGE_0F_PERSON=20;2 .在Java中聲明final常量時(shí)通常都會(huì)加上static關(guān)鍵字,這樣對(duì)象的每個(gè)實(shí)例都會(huì)訪問唯一一份常量值。3 .IDE(IntegratedDevelopmentEnvironment),集成開發(fā)環(huán)境。1) NetBeans。/,最高版本是6.9.12)

24、 JBuilder。3) IntellijIDEA4) Eclipse(日蝕、月蝕),最高版本3.6.15) 集合中存放的依然是對(duì)象的引用而不是對(duì)象本身。5 .ArrayList底層采用數(shù)組實(shí)現(xiàn),當(dāng)使用不帶參數(shù)的構(gòu)造方法生成ArrayList對(duì)象時(shí),實(shí)際上會(huì)在底層生成一個(gè)長度為10的Object類型數(shù)組6 .如果增加的元素個(gè)數(shù)超過了10個(gè),那么ArrayList底層會(huì)新生成一個(gè)數(shù)組,長度為原數(shù)組的1.5倍+1,然后將原數(shù)組的內(nèi)容復(fù)制到新數(shù)組當(dāng)中,并且后續(xù)增加的內(nèi)容都會(huì)放到新數(shù)組當(dāng)中。當(dāng)新數(shù)組無法容納增加的元素時(shí),重復(fù)該過程。7 .對(duì)于ArrayList元素的刪除操作,需要將被刪除元素的后續(xù)元素

25、向前移動(dòng),代價(jià)比較高。8 .集合當(dāng)中只能放置對(duì)象的引用,無法放置原生數(shù)據(jù)類型,我們需要使用原生數(shù)據(jù)類型的包裝類才能加入到集合當(dāng)中。9 .集合當(dāng)中放置的都是Object類型,因此取出來的也是Object類型,那么必須要使用強(qiáng)制類型轉(zhuǎn)換將其轉(zhuǎn)換為真正的類型(放置進(jìn)去的類型)。10 .關(guān)于ArrayList與LinkedList的比較分析a)ArrayList底層采用數(shù)組實(shí)現(xiàn),LinkedList底層采用雙向鏈表實(shí)現(xiàn)。b)當(dāng)執(zhí)行插入或者刪除操作時(shí),采用LinkedList比較好。c)當(dāng)執(zhí)行搜索操作時(shí),采用ArrayList比較好。11 .作業(yè):獨(dú)立分析LinkedList源代碼。12 .作業(yè):閱讀p

26、df文檔。13 .作業(yè):棧與隊(duì)列。1 .當(dāng)向ArrayList添加一個(gè)對(duì)象時(shí),實(shí)際上就是將該對(duì)象放置到了ArrayList底層所維護(hù)的數(shù)組當(dāng)中;當(dāng)向LinkedList中添加一個(gè)對(duì)象時(shí),實(shí)際上LinkedList內(nèi)部會(huì)生成一個(gè)Entry對(duì)象,該Entry對(duì)象的結(jié)構(gòu)為:Entry(Entryprevious;Objectelement;Entrynext;其中的Object類型的元素element就是我們向LinkedList中所添加的元素,然后Entry又構(gòu)造好了向前與向后的引用previous、next,最后將生成的這個(gè)Entry對(duì)象加入到了鏈表當(dāng)中。換句話說,LinkedList中所維護(hù)的

27、是一個(gè)個(gè)的Entry對(duì)象。2 .關(guān)于Object類的equals方法的特點(diǎn)a)自反性:x.equals(x)應(yīng)該返回trueb)對(duì)稱性:x.equals(y)為true,那么y.equals(x)也為true。c)傳遞性:x.equals(y)為true并且y.equals(z)為true,刃B么x.equals(z)也應(yīng)該為trueod)一致性:x.equals(y)的第一次調(diào)用為true,那么x.equals(y)的第二次、第三次、第n次調(diào)用也應(yīng)該為true,前提條件是在比較之間沒有修改x也沒有修改yoe)對(duì)于非空引用x,x.equals(null)返回false。3 .關(guān)于Object類

28、的hashCode()方法的特點(diǎn):a)在Java應(yīng)用的一次執(zhí)行過程當(dāng)中,對(duì)于同一個(gè)對(duì)象的hashCode方法的多次調(diào)用,他們應(yīng)該返回同樣的值(前提是該對(duì)象的信息沒有發(fā)生變化)。b)對(duì)于兩個(gè)對(duì)象來說,如果使用equals方法比較返回true,那么這兩個(gè)對(duì)象的hashCode值一定是相同的。c)對(duì)于兩個(gè)對(duì)象來說,如果使用equals方法比較返回false,那么這兩個(gè)對(duì)象的hashCode值不要求一定不同(可以相同,可以不同),但是如果不同則可以提高應(yīng)用的性能。d)對(duì)于Object類來說,不同的Object對(duì)象的hashCode值是不同的(Object類的hashCode值表示的是對(duì)象的地址)。4

29、.當(dāng)使用HashSet時(shí),hashCode()方法就會(huì)得到調(diào)用,判斷已經(jīng)存儲(chǔ)在集合中的對(duì)象的hashcode值是否與增加的對(duì)象的hashcode值一致;如果不一致,直接加進(jìn)去;如果一致,再進(jìn)行equals方法的比較,equals方法如果返回true,表示對(duì)象已經(jīng)加進(jìn)去了,就不會(huì)再增加新的對(duì)象,否則加進(jìn)去。5 .如果我們重寫equals方法,那么也要重寫hashCode方法,反之亦然。6 .Map(映射):Map的keySet()方法會(huì)返回key的集合,因?yàn)镸ap的鍵是不能重復(fù)的,因此keySet()方法的返回類型是Set;而Map的值是可以重復(fù)的,因此values()方法的返回類型是Colle

30、ction,可以容納重復(fù)的元素。7 .作業(yè):參見Lesson4的要求,使用集合實(shí)現(xiàn),不允許使用數(shù)組。8 .策略模式(StrategyPattern)。通過查詢資料掌握策略模式的原理。9 .閱讀TreeMap的幫助文檔,自己寫一個(gè)程序,練習(xí)TreeMap的使用方式并且自己定義一個(gè)Comparator北京圣思園科技有限公司JavaSELesson71.有這樣一個(gè)類:publicclassPerson(privatemtid;privateStringname;jlprivateintage;/getterandsetter要求:假如有若干個(gè)類Person對(duì)象存在一個(gè)List當(dāng)中,對(duì)他們進(jìn)行排序,分

31、別按照名字、年齡、id進(jìn)行排序(要有正序與倒序兩種排序方式)。假如年齡或者姓名重復(fù),按照id的正序進(jìn)行排序。要求使用策略模式進(jìn)行。2 .HashSet底層是使用HashMa似現(xiàn)的。當(dāng)使用add方法將對(duì)象添加到Set當(dāng)中時(shí),實(shí)際上是將該對(duì)象作為底層所維護(hù)的Map對(duì)象的key,而value則都是同一個(gè)Object對(duì)象(該對(duì)象我們用不上);3 .HashMap底層維護(hù)一個(gè)數(shù)組,我們向HashMap中所放置的對(duì)象實(shí)際上是存儲(chǔ)在該數(shù)組當(dāng)中;4 .當(dāng)向HashMa葉put一對(duì)鍵值時(shí),它會(huì)根據(jù)key的hashCode值計(jì)算出一個(gè)位置,該位置就是此對(duì)象準(zhǔn)備往數(shù)組中存放的位置。5 .如果該位置沒有對(duì)象存在,就將

32、此對(duì)象直接放進(jìn)數(shù)組當(dāng)中;如果該位置已經(jīng)有對(duì)象存在了,則順著此存在的對(duì)象的鏈開始尋找(Entry類有一個(gè)Entry類型的next成員變量,指向了該對(duì)象的下一個(gè)對(duì)象),如果此鏈上有對(duì)象的話,再去使用equals方法進(jìn)行比較,如果對(duì)此鏈上的某個(gè)對(duì)象的equals方法比較為false,則將該對(duì)象放到數(shù)組當(dāng)中,然后將數(shù)組中該位置以前存在的那個(gè)對(duì)象鏈接到此對(duì)象的后面。6 .HashMap的內(nèi)存實(shí)現(xiàn)布局:7 .所謂泛型:就是變量類型的參數(shù)化。北京圣思園科技有限公司1 .當(dāng)遍歷集合或數(shù)組時(shí),如果需要訪問集合或數(shù)組的下標(biāo),那么最好使用舊式的方式來實(shí)現(xiàn)循環(huán)或遍歷,而不要使用增強(qiáng)的for循環(huán),因?yàn)樗鼇G失了下標(biāo)信息。

33、2 .Integer類有一個(gè)緩存,它會(huì)緩存介于-128127之間的整數(shù)。3 .可變參數(shù):可變參數(shù)本質(zhì)上就是一個(gè)數(shù)組,對(duì)于某個(gè)聲明了可變參數(shù)的方法來說,我們既可以傳遞離散的值,也可以傳遞數(shù)組對(duì)象。但如果將方法中的參數(shù)定義為數(shù)組,那么只能傳遞數(shù)組對(duì)象而不能傳遞離散的值。4 .可變參數(shù)必須要作為方法參數(shù)的最后一個(gè)參數(shù),即一個(gè)方法不可能具有兩個(gè)或兩個(gè)以上的可變參數(shù)。5 .枚舉(Enun):我們所定義的每個(gè)枚舉類型都繼承自java.lang.Enum類,枚舉中的每個(gè)成員默認(rèn)都是publicstaticfinal的。6 .而每個(gè)枚舉的成員其實(shí)就是您定義的枚舉類型的一(0實(shí)例(Instance)。換句話說,

34、當(dāng)定義了一個(gè)枚舉類型后,在編譯時(shí)刻就能確定該枚舉類型有幾個(gè)實(shí)例,分別是什么。在運(yùn)行期間我們無法再使用該枚舉類型創(chuàng)建新的實(shí)例了,這些實(shí)例在編譯期間就已經(jīng)完全確定下來了。7 .靜態(tài)導(dǎo)入:a) mon.Common.Age;b) mon.Common.output;8 .表示導(dǎo)入Common1中的靜態(tài)成員變量AGE以及靜態(tài)方法output。注意:使用importstatic時(shí),要一直導(dǎo)入到類中的靜態(tài)成員變量或靜態(tài)方興。9 .Java中,無論生成某個(gè)類的多少個(gè)對(duì)象,這些對(duì)象都會(huì)對(duì)應(yīng)于同一個(gè)Class對(duì)象。1.要想使用反射,首先需要獲得待處理類或?qū)ο笏鶎?duì)應(yīng)的Class對(duì)象。2,獲取某個(gè)類或某個(gè)對(duì)象所對(duì)應(yīng)

35、的Class對(duì)象的常用的3種方式:a)使用Class類的靜態(tài)方法forName:Class.forName("java.lang.String");b)使用類的.class語法:String.class;c)使用對(duì)象的getClass()方法:Strings="aa”;Class<?>clazz=s.getClass();3,若想通過類的不帶參數(shù)的構(gòu)造方法來生成對(duì)象,我們有兩種方式:a)先獲得Class對(duì)象,然后通過該Class對(duì)象的newInstance()方法直接生成即可:Class<?>classType=String.class;O

36、bjectobj=classType.newInstance();b)先獲得Class對(duì)象,然后通過該對(duì)象獲得對(duì)應(yīng)的Constructor對(duì)象,再通過該Constructor對(duì)象的newInstance()方法生成:Class<?>classType=Customer.class;Constructorcons=classType.getConstructor(newClass);Objectobj=cons.newInstance(newObject。);4,若想通過類的帶參數(shù)的構(gòu)造方法生成對(duì)象,只能使用下面這一種方式:Class<?>classType=Custom

37、er.class;Constructorcons=classType.getConstructor(newClassString.class,int.class);Objectobj=cons.newInstance(newObject“hello”,3);5.Integer.TYPE返回的是int,而Integer.class返回的是Integer類所對(duì)應(yīng)的Class對(duì)象。北京圣思園科技有限公司JavaSELesson101,靜態(tài)代理模式圖示2. Java注解(Annotation):a) Override注解表示子類要重寫(override)父類的對(duì)應(yīng)方法。b) Deprecated注解表

38、示方法是不建議被使用的。c) SuppressWarnings注解表示抑制警告。3,自定義注解:當(dāng)注解中的屬性名為value時(shí),在對(duì)其賦值時(shí)可以不指定屬性的名稱而直接寫上屬性值即可;除了value以外的其他值都需要使用name=value這種賦值方式,即明確指定給誰賦值。4 .當(dāng)我們使用interface關(guān)鍵字定義一個(gè)注解時(shí),該注解隱含地繼承了java.lang.annotation.Annotation接口;如果我們定義了一個(gè)接口,并且讓該接口繼承自Annotation,那么我們所定義的接口依然還是接口而不是注解;Annotation本身是接口而不是注解??梢耘cEnurnl比。5 .JUni

39、t(3.8、4.x):Keepthebargreentokeepthecodeclean.6 .我的名言:沒有反射,很多框架就不存在了。(NoReflection,Nomostframeworks)。7 .JUnit4的執(zhí)行的一般流程:a)首先獲得待測試類所對(duì)應(yīng)的Class對(duì)象。b)然后通過該Class對(duì)象獲得當(dāng)前類中所有public方法所對(duì)應(yīng)的Method數(shù)組。c)遍歷該Method數(shù)組,取得每一個(gè)Method對(duì)象d)調(diào)用每個(gè)Method對(duì)象的isAnnotationPresent(Test.class)方法,判斷該方法是否被Test注解所修飾。e)如果該方法返回true,那么調(diào)用metho

40、d.invoke()方法去執(zhí)行該方法,否則不執(zhí)行。8,單元測試不是為了證明你是對(duì)的,而是證明你沒有錯(cuò)誤。9. WritingSecureCode(編寫安全的代碼):Inputisevil。北京圣思園科技有限公司10. 異常(Exception)。11. Java中的異常分為兩大類:a) Checkedexception(非RuntimeException)b) Uncheckedexception(RuntimeException)12. Java中所有的異常類都會(huì)直接或間接地繼承自Exception。13. RuntimeException類也是直接繼承自Exception類,它叫做運(yùn)行時(shí)異

41、常,Java中所有的運(yùn)行時(shí)異常都會(huì)直接或間接地繼承自RuntimeException。14. Java中凡是繼承自Exception而不是繼承自RuntimeException的類都是非運(yùn)行時(shí)異常。15.異常處理的一般結(jié)構(gòu)是:try()catch(Exceptione)()finally()無論程序是否出現(xiàn)異常,finally塊中的代碼都是會(huì)被執(zhí)行的。16 .對(duì)于非運(yùn)行時(shí)異常(checkedexception),必須要對(duì)其進(jìn)行處理,處理方式有兩種:第一種是使用try.catch,finally進(jìn)行捕獲;第二種是在調(diào)用該會(huì)產(chǎn)生異常的方法所在的方法聲明throwsException17 .對(duì)于運(yùn)行

42、時(shí)異常(runtimeexception),我們可以不對(duì)其進(jìn)行處理,也可以對(duì)其進(jìn)行處理。推薦不對(duì)其進(jìn)行處理。18 .NullPointerException是空指針異常,出現(xiàn)該異常的原因在于某個(gè)引用為null,但你北京圣思園科技有限公司卻調(diào)用了它的某個(gè)方法。這時(shí)就會(huì)出現(xiàn)該異常。1 .所謂自定義異常,通常就是定義了一個(gè)繼承自Exception類的子類,那么這個(gè)類就是一個(gè)自定義異常類。通常情況下,我們都會(huì)直接繼承自Exception類,一般不會(huì)繼承某個(gè)運(yùn)行時(shí)的異常類。2 .我們可以使用多個(gè)catch塊來捕獲異常,這時(shí)需要將父類型的catch塊放到子類型的catch塊之后,這樣才能保證后續(xù)的catc

43、h可能被執(zhí)行,否則子類型的catch將永遠(yuǎn)無法到達(dá),Java編譯器會(huì)報(bào)編譯錯(cuò)誤;如果多個(gè)catch塊的異常類型是獨(dú)立的(MyException,MyException2),那么誰前誰后都是可以的。3 .如果try塊中存在return語句,那么首先也需要將finally塊中的代碼執(zhí)行完畢,然后方法再返回。4 .如果try塊中存在System.ex計(jì)(0)語句,那么就不會(huì)執(zhí)行finally塊中的代碼,因?yàn)镾ystem.exit(0)會(huì)終止當(dāng)前運(yùn)行的Java虛擬機(jī),程序會(huì)在虛擬機(jī)終止前結(jié)束執(zhí)行。5 .GUI(GraphicalUserInterface),圖形用戶界面。6 .AWT(Abstract

44、WindowToolkit),抽象窗口工具集,第一代的JavaGUI組件,是重量級(jí)的。7 .Swing,不依賴于底層細(xì)節(jié),輕量級(jí)的組件。JavaSELesson121.?-事件-描述發(fā)生了什么的對(duì)象?-事件源-事件的產(chǎn)生器?-事件處理器-接收事件、解釋事件并處理用戶交互的方法2.當(dāng)單擊一個(gè)按鈕時(shí)就會(huì)產(chǎn)生一個(gè)事件(ActionEvent),然后檢查是否有與該按鈕關(guān)聯(lián)的事件處理器(實(shí)際上就是一個(gè)方法),如果沒有,那么什么都不執(zhí)行;如果有,就會(huì)將該事件傳遞給與該按鈕關(guān)聯(lián)的事件處理器方法,作為該方法的參數(shù),之后該事件處理器方法就會(huì)自動(dòng)得到調(diào)用,并且該方法可以使用傳遞過來的ActionEvent對(duì)象,進(jìn)

45、而獲得事件發(fā)生時(shí)與該事件及事件源相關(guān)聯(lián)的那些信息。3 .Java中的組件若想添加事件處理器,都會(huì)使用形如addXxxListener的方法來添加。4 .作業(yè):實(shí)現(xiàn)一個(gè)簡單的計(jì)算器。Inputisevil.5 .觀察者模式:6 .Swing。7 .作業(yè):1)閱讀Observable類的源代碼,理解Observable類與Observer接口之間的調(diào)用關(guān)系。2)編寫一個(gè)程序,聲明一個(gè)類,該類繼承自O(shè)bservable(因此該類是個(gè)主題角色),有一個(gè)int類型的變量,初始值為10,編寫一個(gè)for循環(huán),將該數(shù)字每次遞減1,一直到0為止,每次變化時(shí),都將該數(shù)字傳遞給它的觀察者,觀察者會(huì)打印出該數(shù)字;第二

46、個(gè)觀察者在該數(shù)字變?yōu)?之后開始打印該數(shù)字。JavaSELesson131 .內(nèi)部類(InnerClass),內(nèi)部類共分為4種。2 .靜態(tài)內(nèi)部類(staticinnerclass):只能訪問外部類的靜態(tài)成員變量與靜態(tài)方法,生成靜態(tài)內(nèi)部類對(duì)象的方式為:OuterClass.InnerClassinner=newOuterClass.InnerClass();3 .成員內(nèi)部類(memberinnerclass):可以訪問外部類的靜態(tài)與非靜態(tài)的方法與成員變量。生成成員內(nèi)部類對(duì)象的方式為:OuterClass.InnerClassinner=newOuterClass().newInnerClass()

47、;4 .若想在局部內(nèi)部類中訪問外部類的成員變量,語法為:OuterClass.this.a;5 .局部內(nèi)部類(LocalInnerClass):定義在方法當(dāng)中,只能訪問方法中聲明的巾nal類型的變量。6 .匿名內(nèi)部類(AnonymousInnerClass):匿名內(nèi)部類會(huì)隱式地繼承一個(gè)父類或?qū)崿F(xiàn)一個(gè)接口。7 .所謂遞歸(Recursion),就是方法調(diào)用自身。對(duì)于遞歸來說,一定有一個(gè)出口,讓遞歸結(jié)束,只有這樣才能保證不出現(xiàn)死循環(huán)。8 .作業(yè):給定任意一個(gè)目錄,以樹形方式展現(xiàn)出該目錄中的所有子目錄和文件。另外,在展現(xiàn)的時(shí)候?qū)⒛夸浥旁谏厦妫募旁谙旅?。每一層要加上縮進(jìn)。JavaSELesson1

48、51 .一個(gè)類若想被序列化,則需要實(shí)現(xiàn)java.io.Serializable接口,該接口中沒有定義任何方法,是一個(gè)標(biāo)識(shí)性接口(MarkerInterface),當(dāng)一個(gè)類實(shí)現(xiàn)了該接口,就表示這個(gè)類的對(duì)象是可以序列化的。2 .在序列化時(shí),static變量是無法序列化的;如果AM含了對(duì)B的引用,那么在序列化A的時(shí)候也會(huì)將整并地序列化;如果此時(shí)加以序列化,B無法序列化,那么當(dāng)序列化A的時(shí)候就會(huì)發(fā)生異常,這時(shí)就需要將對(duì)B的引用設(shè)為transient,該關(guān)鍵字表示變量不會(huì)被序列化。privatevoidwriteObj&ct(java.ioObjectCutputStreamoy.tthrows

49、IOExcoptioncut.writelnt(sqe);out.writeUTF(naine);System.out.piintlnobject1,1>)pzivatevoidreaiobiect(javd.ic-ObjiectinoLtstrejmin)throwslOEjiceptonfClassNotFoundExceptionage=in.tea11nt.();nane=n.reaaUCFH;System.aut-frintlnf"radotje,rt;13 .當(dāng)我們?cè)谝粋€(gè)待序列化/反序列化的類中實(shí)現(xiàn)了以上兩個(gè)private方法(方法聲明要與上面的保持完全的一致),那

50、么就允許我們以更加底層、更加細(xì)粒度的方式控制序列化/反序列化的過程。4 .Java中如果我們自己沒有產(chǎn)生線程,那么系統(tǒng)就會(huì)給我們產(chǎn)生一個(gè)線程(主線程,main方法就在主線程上運(yùn)行),我們的程序都是由線程來執(zhí)行的。5 .進(jìn)程:執(zhí)行中的程序(程序是靜態(tài)的概念,進(jìn)程是動(dòng)態(tài)的概念)。6 .線程的實(shí)現(xiàn)有兩種方式,第一種方式是繼承Thread類,然后重寫run方法;第二種是實(shí)現(xiàn)Runnable接口,然后實(shí)現(xiàn)其run方法。7 .將我們希望線程執(zhí)行的代碼放到run方法中,然后通過start方法來啟動(dòng)線程,start方法首先為線程的執(zhí)行準(zhǔn)備好系統(tǒng)資源,然后再去調(diào)用run方法。當(dāng)某個(gè)類繼承了Thread類之后,該

51、類就叫做一個(gè)線程類。8 .一個(gè)進(jìn)程至少要包含一個(gè)線程。9 .對(duì)于單核CP廉說,某一時(shí)刻只能有一個(gè)線程在執(zhí)行(微觀串行),從宏觀角度來看,多個(gè)線程在同時(shí)執(zhí)行(宏觀并行)。10 .對(duì)于雙核或雙核以上的CP廉說,可以真正做到微觀并行。11 .1)Thread類也實(shí)現(xiàn)了Runnable接口,因此實(shí)現(xiàn)了Runnable接口中的run方法;2)當(dāng)生成一個(gè)線程對(duì)象時(shí),如果沒有為其設(shè)定名字,那么線程對(duì)象的名字將使用如下形式:Thread-number,該number#是自動(dòng)增力口的,并被所有的Thread對(duì)象所共享(因?yàn)樗莝tatic的成員變量)。3)當(dāng)使用第一種方式來生成線程對(duì)象時(shí),我們需要重寫run方法

52、,因?yàn)門hread類的run方法此時(shí)什么事情也不做。JavaSELesson161 .如果某個(gè)synchronized方法是static的,那么當(dāng)線程訪問該方法時(shí),它鎖的并不是synchronized方法所在的對(duì)象,而是synchronized方法所在的對(duì)象所對(duì)應(yīng)的Class對(duì)象,因?yàn)镴ava中無論一個(gè)類有多少個(gè)對(duì)象,這些對(duì)象會(huì)對(duì)應(yīng)唯一一個(gè)Class對(duì)象,因此當(dāng)線程分別訪問同一個(gè)類的兩個(gè)對(duì)象的兩個(gè)static,synchronized方法時(shí),他們的執(zhí)行順序也是順序的,也就是說一個(gè)線程先去執(zhí)行方法,執(zhí)行完畢后另一個(gè)線程才開始執(zhí)行。2 .synchronized塊,寫法:synchronized(

53、object)()表示線程在執(zhí)行的時(shí)候會(huì)對(duì)object對(duì)象上鎖。3 .synchronized方法是一種粗粒度的并發(fā)控制,某一時(shí)刻,只能有一個(gè)線程執(zhí)行該synchronized方法;synchronized塊則是一種細(xì)粒度的并發(fā)控制,只會(huì)將塊中的代碼同步,位于方法內(nèi)、synchronized塊之外的代碼是可以被多個(gè)線程同時(shí)訪問到的。4 .死鎖(deadlock)5 .wait與notify方法都是定義在Object類中,而且是巾nal的,因此會(huì)被所有的Java類所繼承并且無法重寫。這兩個(gè)方法要求在調(diào)用時(shí)線程應(yīng)該已經(jīng)獲得了對(duì)象的鎖,因此對(duì)這兩個(gè)方法的調(diào)用需要放在synchronized方法或塊當(dāng)

54、中。當(dāng)線程執(zhí)行了wait方法時(shí),它會(huì)釋放掉對(duì)象的鎖。6 .另一個(gè)會(huì)導(dǎo)致線程暫停的方法就是Thread類的sleep方法,它會(huì)導(dǎo)致線程睡眠指定的毫秒數(shù),但線程在睡眠的過程中是不會(huì)釋放掉對(duì)象的鎖的。JavaSELesson171 .對(duì)于單例模式(Singleton)來說,如果在getInstance()方法中生成Singleton實(shí)例則可能會(huì)產(chǎn)生同步問題,即可能會(huì)生成兩個(gè)不同的對(duì)象。JAVASELesson201 .客戶端與服務(wù)器端之間的通信全部采用XM陵現(xiàn):1)用戶登錄(type=1):<?xmlversion="1.0"encoding="utf-8&quo

55、t;?><message><type>1</type><user>zhangsan</user></message>type=4):2)服務(wù)器端向所有客戶端發(fā)送的在線用戶列表(<?xmlversion="1.0"encoding="utf-8"?><message><type>4</type><user>zhangsan</user><user>lisi</user><user

56、>wangwu</user></message>JAVASELesson211.客戶端與服務(wù)器端之間的通信全部采用XM陵現(xiàn):1)用戶登錄(type=1):<?xmlversion="1.0"encoding="utf-8"?><message><type>1</type><user>zhangsan</user></message>2)服務(wù)器端向所有客戶端發(fā)送的在線用戶列表(type=4):<?xmlversion="1.0&

57、quot;encoding="utf-8"?><message><type>4</type><user>zhangsan</user><user>lisi</user><user>wangwu</user></message>3)客戶端向服務(wù)器端發(fā)送的聊天數(shù)據(jù)(type=2):<message><type>2</type><user>zhangsan</user><content>

58、;chatmessage</content></message>4)服務(wù)器端向所有客戶端發(fā)送的聊天數(shù)據(jù)(type=3):<message><type>3</type><content>zhangsan:chatmessage</content></message>5)關(guān)閉服務(wù)器端窗口(type=6):<message><type>6</type></message>6)關(guān)閉客戶端窗口(type=5):<message><type>5</type><user>zhangsan</user><content>clientclosed</content></message>7 .服務(wù)器端確認(rèn)客戶端關(guān)閉(type=7)<message>&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論