2022年全套詳細筆記心血放出資料_第1頁
2022年全套詳細筆記心血放出資料_第2頁
2022年全套詳細筆記心血放出資料_第3頁
2022年全套詳細筆記心血放出資料_第4頁
2022年全套詳細筆記心血放出資料_第5頁
已閱讀5頁,還剩111頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、目錄 TOC o 1-3 h z u HYPERLINK l _Toc4 1.原碼、反碼、補碼 PAGEREF _Toc4 h 1 HYPERLINK l _Toc5 1.1.原碼 PAGEREF _Toc5 h 1 HYPERLINK l _Toc6 1.2.反碼 PAGEREF _Toc6 h 1 HYPERLINK l _Toc7 1.3.補碼 PAGEREF _Toc7 h 1 HYPERLINK l _Toc8 1.4.負數(shù)的補碼轉(zhuǎn)換為十進制數(shù) PAGEREF _Toc8 h 2 HYPERLINK l _Toc9 2.char PAGEREF _Toc9 h 2 HYPERLINK

2、 l _Toc0 3.運算符 PAGEREF _Toc0 h 2 HYPERLINK l _Toc1 3.1.移位運算符 PAGEREF _Toc1 h 2 HYPERLINK l _Toc2 3.2.位運算符 PAGEREF _Toc2 h 3 HYPERLINK l _Toc3 3.3.邏輯運算符 PAGEREF _Toc3 h 3 HYPERLINK l _Toc4 4.流程控制 PAGEREF _Toc4 h 3 HYPERLINK l _Toc5 4.1.switch PAGEREF _Toc5 h 3 HYPERLINK l _Toc6 4.2.break和continue PAG

3、EREF _Toc6 h 4 HYPERLINK l _Toc7 5.方法 PAGEREF _Toc7 h 4 HYPERLINK l _Toc8 5.1.構(gòu)造方法 PAGEREF _Toc8 h 4 HYPERLINK l _Toc9 5.2.方法重載 PAGEREF _Toc9 h 4 HYPERLINK l _Toc0 6.this PAGEREF _Toc0 h 5 HYPERLINK l _Toc1 7.繼承 PAGEREF _Toc1 h 5 HYPERLINK l _Toc2 7.1.super PAGEREF _Toc2 h 5 HYPERLINK l _Toc3 7.2.多態(tài)

4、(polymorphism) PAGEREF _Toc3 h 6 HYPERLINK l _Toc4 7.3.instanceof PAGEREF _Toc4 h 6 HYPERLINK l _Toc5 8.static PAGEREF _Toc5 h 7 HYPERLINK l _Toc6 9.final PAGEREF _Toc6 h 7 HYPERLINK l _Toc7 10.abstract PAGEREF _Toc7 h 8 HYPERLINK l _Toc8 11.類的加載 PAGEREF _Toc8 h 8 HYPERLINK l _Toc9 11.1.觸發(fā)類加載的幾種情況 P

5、AGEREF _Toc9 h 8 HYPERLINK l _Toc0 11.2.類加載的順序 PAGEREF _Toc0 h 8 HYPERLINK l _Toc1 12.接口(interface) PAGEREF _Toc1 h 9 HYPERLINK l _Toc2 13.訪問控制 PAGEREF _Toc2 h 10 HYPERLINK l _Toc3 14.Object類 PAGEREF _Toc3 h 11 HYPERLINK l _Toc4 14.1.clone() PAGEREF _Toc4 h 11 HYPERLINK l _Toc5 14.1.1.對象克隆過程 PAGEREF

6、 _Toc5 h 11 HYPERLINK l _Toc6 14.1.2.淺復(fù)制和深復(fù)制概念 PAGEREF _Toc6 h 12 HYPERLINK l _Toc7 14.2.finalize() PAGEREF _Toc7 h 12 HYPERLINK l _Toc8 14.3.equals(Object obj) PAGEREF _Toc8 h 12 HYPERLINK l _Toc9 14.4.toString() PAGEREF _Toc9 h 12 HYPERLINK l _Toc0 15.String類及對象池 PAGEREF _Toc0 h 12 HYPERLINK l _To

7、c1 15.1.String a=hello; PAGEREF _Toc1 h 13 HYPERLINK l _Toc2 15.2.String c=new String(hello); PAGEREF _Toc2 h 13 HYPERLINK l _Toc3 16.StringBuffer和StringBuilder PAGEREF _Toc3 h 13 HYPERLINK l _Toc4 17.主方法參數(shù) PAGEREF _Toc4 h 14 HYPERLINK l _Toc5 18.方法的可變長參數(shù) PAGEREF _Toc5 h 14 HYPERLINK l _Toc6 19.包裝類

8、PAGEREF _Toc6 h 14 HYPERLINK l _Toc7 19.1.Number PAGEREF _Toc7 h 15 HYPERLINK l _Toc8 19.2.自動封箱/自動解封(Autoboxing/Unboxing) PAGEREF _Toc8 h 15 HYPERLINK l _Toc9 19.3.對象池 PAGEREF _Toc9 h 15 HYPERLINK l _Toc0 20.內(nèi)部類 PAGEREF _Toc0 h 16 HYPERLINK l _Toc1 20.1.意義 PAGEREF _Toc1 h 16 HYPERLINK l _Toc2 20.2.四

9、種形式的內(nèi)部類 PAGEREF _Toc2 h 16 HYPERLINK l _Toc3 20.2.1.靜態(tài)內(nèi)部類 PAGEREF _Toc3 h 16 HYPERLINK l _Toc4 20.2.2.成員內(nèi)部類 PAGEREF _Toc4 h 17 HYPERLINK l _Toc5 20.2.3.局部內(nèi)部類 PAGEREF _Toc5 h 18 HYPERLINK l _Toc6 20.2.4.匿名內(nèi)部類 PAGEREF _Toc6 h 18 HYPERLINK l _Toc7 20.3.內(nèi)部類的應(yīng)用 PAGEREF _Toc7 h 20 HYPERLINK l _Toc8 21.集合框

10、架(Collection Framework) PAGEREF _Toc8 h 20 HYPERLINK l _Toc9 21.1.Iterator接口和Iterable接口 PAGEREF _Toc9 h 21 HYPERLINK l _Toc0 21.2.Connection接口和Connections類 PAGEREF _Toc0 h 21 HYPERLINK l _Toc1 21.2.1.java.util.Collection PAGEREF _Toc1 h 21 HYPERLINK l _Toc2 21.2.2.java.util.Collections PAGEREF _Toc2

11、 h 21 HYPERLINK l _Toc3 21.3.List(列表)接口 PAGEREF _Toc3 h 21 HYPERLINK l _Toc4 21.3.1.ArrayList PAGEREF _Toc4 h 22 HYPERLINK l _Toc5 21.3.2.LinkedList PAGEREF _Toc5 h 22 HYPERLINK l _Toc6 21.3.3.Vector PAGEREF _Toc6 h 22 HYPERLINK l _Toc7 21.4.Set(集合)接口 PAGEREF _Toc7 h 22 HYPERLINK l _Toc8 21.4.1.Hash

12、Set PAGEREF _Toc8 h 23 HYPERLINK l _Toc9 21.4.2.TreeSet PAGEREF _Toc9 h 25 HYPERLINK l _Toc0 21.5.排序的兩種辦法 PAGEREF _Toc0 h 25 HYPERLINK l _Toc1 21.5.1.java.lang.Comparable(可比較的) PAGEREF _Toc1 h 25 HYPERLINK l _Toc2 21.5.2.java.util.Comparator(比較器) PAGEREF _Toc2 h 26 HYPERLINK l _Toc3 21.6.Map PAGEREF

13、 _Toc3 h 26 HYPERLINK l _Toc4 21.6.1.HashMap PAGEREF _Toc4 h 26 HYPERLINK l _Toc5 21.6.2.Hashtable PAGEREF _Toc5 h 27 HYPERLINK l _Toc6 21.6.3.Hashtable下的子類Properties類 PAGEREF _Toc6 h 27 HYPERLINK l _Toc7 21.6.4.SortedMap接口下的TreeMap類 PAGEREF _Toc7 h 27 HYPERLINK l _Toc8 22.泛型(Generic) PAGEREF _Toc8

14、h 28 HYPERLINK l _Toc9 22.1.泛型特點 PAGEREF _Toc9 h 28 HYPERLINK l _Toc0 22.2.通配符 PAGEREF _Toc0 h 28 HYPERLINK l _Toc1 22.2.1.上限通配符: PAGEREF _Toc1 h 28 HYPERLINK l _Toc2 22.2.2.下限通配符 PAGEREF _Toc2 h 29 HYPERLINK l _Toc3 22.2.3.總結(jié): PAGEREF _Toc3 h 29 HYPERLINK l _Toc4 22.3.運用 PAGEREF _Toc4 h 30 HYPERLIN

15、K l _Toc5 23.異常 PAGEREF _Toc5 h 30 HYPERLINK l _Toc6 23.1.異常處理基礎(chǔ) PAGEREF _Toc6 h 30 HYPERLINK l _Toc7 23.2.異常的類繼承結(jié)構(gòu) PAGEREF _Toc7 h 30 HYPERLINK l _Toc8 23.3.常見的未檢查異常 PAGEREF _Toc8 h 31 HYPERLINK l _Toc9 23.4.throw PAGEREF _Toc9 h 31 HYPERLINK l _Toc0 23.5.自定義異常類 PAGEREF _Toc0 h 32 HYPERLINK l _Toc1

16、 24.反射(Reflection) PAGEREF _Toc1 h 33 HYPERLINK l _Toc2 24.1.反射需要用到的類 PAGEREF _Toc2 h 33 HYPERLINK l _Toc3 24.1.1.java.lang.Class PAGEREF _Toc3 h 33 HYPERLINK l _Toc4 24.1.2.java.lang.reflect.Field PAGEREF _Toc4 h 34 HYPERLINK l _Toc5 24.1.3.java.lang.Package PAGEREF _Toc5 h 34 HYPERLINK l _Toc6 24.

17、1.4.java.lang.relect.Modifier PAGEREF _Toc6 h 34 HYPERLINK l _Toc7 24.1.5.java.lang.reflect.Mothed PAGEREF _Toc7 h 34 HYPERLINK l _Toc8 24.1.6.java.lang.reflect.Array PAGEREF _Toc8 h 34 HYPERLINK l _Toc9 24.1.7.java.lang.reflect.Constructor PAGEREF _Toc9 h 34 HYPERLINK l _Toc0 24.2.三種獲得某個類的Class對象的方

18、法 PAGEREF _Toc0 h 34 HYPERLINK l _Toc1 24.2.1.Class c=Class.forName(類名); PAGEREF _Toc1 h 34 HYPERLINK l _Toc2 24.2.2.Class c=類名.class; PAGEREF _Toc2 h 35 HYPERLINK l _Toc3 24.2.3.Class c=對象名.getClass(); PAGEREF _Toc3 h 35 HYPERLINK l _Toc4 24.3.所能探查出來的類的特征 PAGEREF _Toc4 h 35 HYPERLINK l _Toc5 24.4.通

19、過反射生成一個類的實例 PAGEREF _Toc5 h 35 HYPERLINK l _Toc6 24.4.1.第一種方法 PAGEREF _Toc6 h 36 HYPERLINK l _Toc7 24.4.2.第二種方法 PAGEREF _Toc7 h 36 HYPERLINK l _Toc8 25.File PAGEREF _Toc8 h 36 HYPERLINK l _Toc9 25.1.構(gòu)造方法 PAGEREF _Toc9 h 36 HYPERLINK l _Toc0 25.2.重點方法 PAGEREF _Toc0 h 37 HYPERLINK l _Toc1 25.3.目錄 PAGE

20、REF _Toc1 h 38 HYPERLINK l _Toc2 26.流 PAGEREF _Toc2 h 38 HYPERLINK l _Toc3 26.1.字節(jié)流 PAGEREF _Toc3 h 38 HYPERLINK l _Toc4 26.2.字符流 PAGEREF _Toc4 h 40 HYPERLINK l _Toc5 26.3.節(jié)點流(Node Stream): PAGEREF _Toc5 h 41 HYPERLINK l _Toc6 26.4.過濾流 (Filter Stream) PAGEREF _Toc6 h 41 HYPERLINK l _Toc7 26.5.Object

21、InputStream和ObjectOutputStream PAGEREF _Toc7 h 42 HYPERLINK l _Toc8 26.6.字節(jié)流轉(zhuǎn)化成字符流的橋轉(zhuǎn)換器 PAGEREF _Toc8 h 44 HYPERLINK l _Toc9 26.7.文本文件和二進制文件 PAGEREF _Toc9 h 46 HYPERLINK l _Toc0 27.線程 PAGEREF _Toc0 h 46 HYPERLINK l _Toc1 27.1.概念與原理 PAGEREF _Toc1 h 46 HYPERLINK l _Toc2 27.1.1.操作系統(tǒng)中線程和進程的概念 PAGEREF _T

22、oc2 h 46 HYPERLINK l _Toc3 27.1.2.Java中的線程 PAGEREF _Toc3 h 47 HYPERLINK l _Toc4 27.1.3.Java中的線程模型 PAGEREF _Toc4 h 47 HYPERLINK l _Toc5 27.1.4.一些常見問題 PAGEREF _Toc5 h 47 HYPERLINK l _Toc6 27.2.線程狀態(tài)的轉(zhuǎn)換 PAGEREF _Toc6 h 48 HYPERLINK l _Toc7 27.2.1.線程的七種狀態(tài) PAGEREF _Toc7 h 48 HYPERLINK l _Toc8 27.2.2.阻止線程執(zhí)

23、行 PAGEREF _Toc8 h 50 HYPERLINK l _Toc9 27.3.線程的同步與鎖 PAGEREF _Toc9 h 51 HYPERLINK l _Toc0 27.3.1.同步和鎖定 PAGEREF _Toc0 h 51 HYPERLINK l _Toc1 27.3.2.靜態(tài)方法同步 PAGEREF _Toc1 h 56 HYPERLINK l _Toc2 27.3.3.如果線程不能獲得鎖會怎么樣 PAGEREF _Toc2 h 56 HYPERLINK l _Toc3 27.3.4.何時需要同步 PAGEREF _Toc3 h 57 HYPERLINK l _Toc4 2

24、7.3.5.線程安全類 PAGEREF _Toc4 h 57 HYPERLINK l _Toc5 27.3.6.線程死鎖 PAGEREF _Toc5 h 58 HYPERLINK l _Toc6 27.3.7.線程同步小結(jié) PAGEREF _Toc6 h 59 HYPERLINK l _Toc7 27.4.線程的交互 PAGEREF _Toc7 h 60 HYPERLINK l _Toc8 27.4.1.線程交互的基礎(chǔ)知識 PAGEREF _Toc8 h 60 HYPERLINK l _Toc9 27.4.2.多個線程在等待一個對象鎖時候使用notifyAll() PAGEREF _Toc9

25、h 62 HYPERLINK l _Toc0 27.5.守護線程(后臺服務(wù)線程) PAGEREF _Toc0 h 63 HYPERLINK l _Toc1 27.6.并發(fā)協(xié)作-生產(chǎn)者消費者模型 PAGEREF _Toc1 h 64 HYPERLINK l _Toc2 27.7.volatile關(guān)鍵字 PAGEREF _Toc2 h 64 HYPERLINK l _Toc3 28.網(wǎng)絡(luò)編程 PAGEREF _Toc3 h 65 HYPERLINK l _Toc4 28.1.TCP Socket編程 PAGEREF _Toc4 h 65 HYPERLINK l _Toc5 28.1.1.Serve

26、rSocket PAGEREF _Toc5 h 66 HYPERLINK l _Toc6 28.1.2.Socket PAGEREF _Toc6 h 66 HYPERLINK l _Toc7 28.2.UDP Socket編程 PAGEREF _Toc7 h 67 HYPERLINK l _Toc8 28.2.1.DatagramSocket PAGEREF _Toc8 h 67 HYPERLINK l _Toc9 28.2.2.DatagramPacket PAGEREF _Toc9 h 67原碼、反碼、補碼原碼將最高位作為符號位(以0代表正,1代表負),其余各位代表數(shù)值本身的絕對值(以二進

27、制表示)。為了簡單起見,我們用1個字節(jié)來表示一個整數(shù):+7的原碼為:00000111-7的原碼為:問題:+0的原碼為:00000000-0的原碼為:反碼一個數(shù)如果為正,則它的反碼與原碼相同;一個數(shù)如果為負,則符號位為1,其余各位是對原碼取反。為了簡單起見,我們用1個字節(jié)來表示一個整數(shù):+7的反碼為:00000111-7的反碼為:問題:+0的反碼為:00000000-0的反碼為:補碼利用溢出,我們可以將減法變成加法。對于十進制數(shù),如果從9得到結(jié)果5,可以用減法:9-4=5;因為4+6=10,我們將6作為4的補數(shù),將上式的減法改寫為加法:9+6=15;去掉高位1(也就是減去10),得到結(jié)果5。對于

28、16進制數(shù),如果從C得到結(jié)果5,可以用減法:C-7=5;因為7+9=16,我們將9作為7的補數(shù),將上式的減法改寫為加法:C+9=15;去掉高位1(也就是減去16),得到結(jié)果5。在計算機中,如果我們用1個字節(jié)表示一個數(shù),一個字節(jié)有8位,超過8位就進1,在內(nèi)存中情況為:1 00000000,進位1被丟棄。一個數(shù)如果為正,則它的原碼、反碼、補碼相同;一個數(shù)如果為負,則符號位為1,其余各位是對原碼取反,然后整個數(shù)加1。為了簡單起見,我們用1個字節(jié)來表示一個整數(shù)。+7的補碼為:00000111-7的補碼為:負數(shù)的補碼轉(zhuǎn)換為十進制數(shù)先對各位取反;將其轉(zhuǎn)換為十進制數(shù);加上負號,再減去1。例如:,最高位為1,

29、是負數(shù),先對各位取反得00000101,轉(zhuǎn)換為十進制數(shù)得5,加上負號得-5,再減1得-6。charchar類型(2字節(jié))用于表示Unicode編碼的字符單元;char類型用于表示單個字符,通常用來表示字符常量。例如:A是編碼為65所對應(yīng)的字符常量。Unicode編碼單元可以表示為十六進制值,其范圍從u0000到uffff。除了可以采用轉(zhuǎn)義序列符u表示Unicode代碼單元的編碼之外,還有一些用于表示特殊字符的轉(zhuǎn)義序列符。如:轉(zhuǎn)義序列名稱Unicode值b退格(Backspace)u0008t制表(Tab)u0009n換行(Linefeed)u000ar回車u000d”雙引號(Double qu

30、ote)u0022單引號(Single quote)u0027反斜杠(Backslash)u005c盡管char不是整數(shù),但在許多情況中你可以對它們進行運算操作就好像他們是整數(shù)一樣,這允許你可以將2個字符相加,或?qū)σ粋€字符變量值進行增量操作。運算符移位運算符只能針對二進制數(shù)據(jù)(整數(shù)) 右移,右移一位相當(dāng)于除2取整,兩位相當(dāng)于連續(xù)除2取整而不是除4取整,看正數(shù)還是負數(shù),正數(shù)右移的話高位補0,負數(shù)的話補1; 無符號右移(算數(shù)右移),不考慮符號位,移進來的都補0。位運算符& 按位與,兩個數(shù)按位與,全部轉(zhuǎn)換成二進制后按位比較,全為1才是1,其它是0,返回一個新的整數(shù);| 按位或,兩個數(shù)按位或,全部轉(zhuǎn)換

31、成二進制后按位比較,全為0才是0,其它是1,返回一個新的整數(shù); 按位異或,兩個數(shù)的二進制位數(shù)比較,相同結(jié)果為0,相異結(jié)果為1; 按位求反,把一個數(shù)二進制的每一位都反過來。邏輯運算符& 短路與,兩邊如果左邊是假的話就不再判斷右邊的,直接返回假;| 短路或,兩邊如果有一個為真的就不再判斷右邊的,直接返回真;& 與,不管怎樣兩邊都會判斷,都為真才返回真;| 或,不管怎樣兩邊都會判斷,都為假才返回假。流程控制switchswitch后括號中的值必須是int,byte,char,short,枚舉類型的變量之一,其它類型的就不行了;每個case后面的值必須是不相等的,而且必須是常量;如果每個case冒號后

32、面的語句執(zhí)行完后沒有break,還會繼續(xù)執(zhí)行后面case里的語句,所以在每個case的語句結(jié)束后加一個break;多個case可以可并到一起,表示或的關(guān)系;default代表如果和所有case后的值都不匹配,就執(zhí)行這里的語句。無論default寫哪都是最后執(zhí)行的。public class Grade public static void main(String args) Scanner sca = new Scanner(System.in);System.out.println(請輸入一個百分數(shù):);int s = sca.nextInt();if (s 100) System.out.p

33、rintln(ERROR DATA:S);System.exit(0);/ 退出這個程序switch (s / 10) case 10:case 9:System.out.println(A);break;case 8:System.out.println(B);break;case 7:System.out.println(C);break;case 6:System.out.println(D);break;default:System.out.println(E);break;break和continuebreak退出當(dāng)前的循環(huán)體,在嵌套循環(huán)中,只退出當(dāng)前的一層循環(huán);continue結(jié)束

34、當(dāng)前本次循環(huán),繼續(xù)進行下一輪的循環(huán)??梢哉f,只是本次忽略循環(huán)內(nèi)后面的語句;continue只能在循環(huán)體內(nèi)用;break可以用在任意代碼塊中,表示退出當(dāng)前程序塊(配合標簽使用,很好用)。方法構(gòu)造方法每次在創(chuàng)建實例變量,對類中的所有變量都要初始化是很乏味的。如果在一個對象最初被創(chuàng)建時就把對它的設(shè)置做好,那樣的話,程序?qū)⒏唵尾⑶腋喢?。因為對初始化的要求是共同的,Java允許對象在他們被創(chuàng)造時初始化自己。這種自動的初始化是通過使用構(gòu)造方法來完成的。構(gòu)造方法在對象創(chuàng)建時初始化。一旦定義了構(gòu)造方法,在對象創(chuàng)建后,在new運算符完成前,構(gòu)造方法立即自動調(diào)用。構(gòu)造方法看起來有點奇怪,因為它沒有任何返回值,

35、即使是void型的值也不返回。這是因為一個類的構(gòu)造方法內(nèi)隱藏的類型是它自己類的類型。構(gòu)造方法的任務(wù)就是初始化一個對象的內(nèi)部狀態(tài),以便使創(chuàng)建的實例變量能夠完全初始化,可以被對象馬上使用。方法重載在Java中,同一個類中的2個或2個以上的方法可以有同一個名字,只要它們的參數(shù)聲明不同即可。在這種情況下,該方法就被稱為重載(overloaded)。當(dāng)一個重載方法被調(diào)用時,Java用參數(shù)的類型和(或)數(shù)量來表明實際調(diào)用的重載方法的版本。因此,每個重載方法的參數(shù)的類型和(或)數(shù)量必須是不同的。當(dāng)一個重載的方法被調(diào)用時,Java在調(diào)用方法的參數(shù)和方法的自變量之間尋找匹配。但是,這種匹配并不總是精確的。在一些

36、情況下,Java的自動類型轉(zhuǎn)換也適用于重載方法的自變量。例如: class OverloadDemo void test(double a) System.out.println(Inside test(double) a: + a); class Overload public static void main(String args) OverloadDemo ob = new OverloadDemo(); int i = 88; ob.test(i); OverloadDemo的這個版本沒有定義test(int)。因此當(dāng)在Overload內(nèi)帶整數(shù)參數(shù)調(diào)用test()時,找不到和它匹配的

37、方法。但是,Java可以自動地將整數(shù)轉(zhuǎn)換為double型,這種轉(zhuǎn)換就可以解決這個問題。因此,在test(int)找不到以后,Java將i擴大到double型,然后調(diào)用test(double)。當(dāng)然,如果定義了test(int),當(dāng)然先調(diào)用test(int)而不會調(diào)用test(double)。只有在找不到精確匹配時,Java的自動轉(zhuǎn)換才會起作用。thisthis等價于當(dāng)前對象,調(diào)用當(dāng)前對象的屬性或方法就用this.屬性名,或this.方法名()。當(dāng)前對象:指誰在調(diào)用當(dāng)前這個方法和屬性,誰就是當(dāng)前對象。在定義類的時候是不存在當(dāng)前對象的。在局部變量與外部變量同名的時候,為了區(qū)分,就要在外部變量的前面

38、加一個this來表示這個變量是類的全局變量。繼承盡管子類包括超類的所有成員,它不能訪問超類中被聲明成private的成員。子類的對象可以調(diào)用父類的一切公有的變量和方法,也可以擴展自己新的屬性和方法,但是新擴展的部分父類的對象是無法調(diào)用的。super在子類的構(gòu)造方法中調(diào)用父類的構(gòu)造方法,并且super要放在第一行,不能與this一起用,主要用為在構(gòu)造子類的時候給父類中定義的變量賦值:任何子類的構(gòu)造方法都會調(diào)用父類的構(gòu)造方法:因為調(diào)用構(gòu)造方法和創(chuàng)建一個對象是綁在一起的,而一個子類對象的一部分可以看做是父類對象,所以當(dāng)創(chuàng)建一個子類對象時一定是先創(chuàng)建一個父類的對象,再在父類對象的基礎(chǔ)上擴展(exten

39、ds)成一個子類對象。注意:自始至終只創(chuàng)建了一個對象,因為創(chuàng)建的那一個子類對象的一部分是父類對象(上帝想創(chuàng)造一個科學(xué)家,肯定是先創(chuàng)造一個人,在人的基礎(chǔ)上進行教育培訓(xùn)等,最終變成一個科學(xué)家,而最初的人和最后的科學(xué)家其實是一個對象);任何子類的構(gòu)造方法的第一行必須是this(.)或super(.)的調(diào)用,如果程序員不寫,則系統(tǒng)會隱含的調(diào)用super(),也就是說子類無論如何都會調(diào)用父類的構(gòu)造方法,沒寫就調(diào)用父類的無參構(gòu)造方法;子類構(gòu)造方法的第一行只能出現(xiàn)this(.),super(.)這兩種情況,無論怎么調(diào)用,最終總能找到父類構(gòu)造方法,否則造成死循環(huán)。因為如果子類的某個構(gòu)造方法的第一行出現(xiàn)this

40、(.),此時系統(tǒng)不會加上缺省的super()那么this(.)會調(diào)用子類的其他構(gòu)造方法,所以子類的構(gòu)造方法之間開始調(diào)用,如果子類的所有的構(gòu)造方法的第一行全都是this(.)那便構(gòu)成了一個死循環(huán)。多態(tài)(polymorphism)對象的多態(tài):一個對象多種形態(tài)。方法的重載和覆蓋就是方法多態(tài)的一種體現(xiàn);對象多態(tài)的基礎(chǔ):子類對象可以當(dāng)作父類對象來看,例如:Animal a=new Bird();多態(tài)定理:如果我們把子類對象當(dāng)作父類對象來看,那么就只能訪問父類中已有定義的屬性和方法(不能訪問子類擴展的屬性和方法)。如果子類覆蓋了父類的方法,再把子類對象當(dāng)作父類對象去調(diào)用該方法時,調(diào)用的是子類覆蓋后的方法(

41、對象的行為不可能因為你把它當(dāng)作什么來看而改變);Animal a=new Bird()左邊是編譯時類型:在代碼編譯過程中,編譯器把這個對象當(dāng)作什么來看?(父類對象)。右邊是運行時類型:在代碼執(zhí)行過程中,JVM把這個對象當(dāng)作什么看?(子類對象)。左邊是主觀認為(我們把a當(dāng)作什么看?),右邊是客觀存在(a實際是什么)。當(dāng)你把鳥當(dāng)動物看時,你知道它是動物,但你不知道它是鳥,所以你知道它會走會吃,但你不知道它會唱歌(相當(dāng)于編譯器把它當(dāng)Animal),所以你不會試圖去調(diào)用它的唱歌的方法,因為你根本就不知道它會唱歌。當(dāng)你調(diào)用move()方法時,它會flying,因為它本質(zhì)上還是個鳥,不會因為你把它當(dāng)作動物

42、而不會飛用走的路。instanceof當(dāng)發(fā)生多層次復(fù)雜的繼承機構(gòu)時,往往使程序員自己都搞不清楚最后這個對象到底是什么了,這時就需要提供一個方法來判斷一下了。判斷一個對象是不是某一個類型的實例,看這個對象能不能作為這個對象實例來看(看這個對象運行時的類型,即看這個對象的客觀存在是什么)。static描述整體特征而不是個體特征的屬性時,用靜態(tài)修飾符;有時你希望定義一個類成員,使它的使用完全獨立于該類的任何對象。通常情況下,類成員必須通過它的類的對象訪問,但是可以創(chuàng)建這樣一個成員,它能夠被它自己使用,而不必引用特定的實例。成員的聲明前面加上關(guān)鍵字static就能創(chuàng)建這樣的成員。如果一個成員被聲明為s

43、tatic,它就能夠在它的類的任何對象創(chuàng)建之前被訪問,而不必引用任何對象。你可以將方法和變量都聲明為static,static成員的最常見的例子是main(),因為在程序開始執(zhí)行時必須調(diào)用main(),所以它被聲明為static。聲明為static的變量實質(zhì)上就是全局變量,當(dāng)聲明一個對象時,并不產(chǎn)生static變量的拷貝,而是該類所有的實例變量共用同一個static變量。聲明為static的方法有以下幾條限制它們僅能調(diào)用其他的static方法;它們只能訪問static數(shù)據(jù);它們不能以任何方式引用this或super。靜態(tài)變量和非靜態(tài)變量(實例變量)的差別空間分配時機:靜態(tài)變量是在類加載的時候分

44、配空間,非靜態(tài)對象是在生成對象的時候分配空間;空間分配方式:不管有多少對象靜態(tài)變量只有一份(所有對象共享),非靜態(tài)變量有多少對象就分配多少個空間;訪問方式:靜態(tài)變量是:類名.屬性,比如Animal.COUNT;非靜態(tài)變量:對象名.屬性,比如。靜態(tài)方法和非靜態(tài)方法的區(qū)別靜態(tài)方法是通過類名來調(diào)用,非靜態(tài)方法是通過對象來調(diào)用;靜態(tài)方法中不能訪問本類的非靜態(tài)成員,但非靜態(tài)方法可以訪問靜態(tài)成員;靜態(tài)方法不存在多態(tài)特性,也就是靜態(tài)方法無法被子類覆蓋,父類對象調(diào)用此方法還是父類的。靜態(tài)代碼塊靜態(tài)代碼塊會在類被加載時被系統(tǒng)自動執(zhí)行;一般可以在靜態(tài)代碼塊中給靜態(tài)屬性賦值;類的靜態(tài)代碼塊只能有一個。final聲明

45、為final的變量在實例中不占用內(nèi)存;一個final變量實質(zhì)上是一個常數(shù);修飾屬性時屬性不可變,并且屬性在聲明的時候必須初始化,或者在構(gòu)造方法中初始化一般與static一起用,一旦定義了,就不能再變了;修飾方法時方法不能被覆蓋;修飾類是類不能被繼承,表示最終的類,不能有子類;修飾局部變量時局部變量不可變(常量)。abstract用來修飾類和方法;修飾類的話表示這個類是個抽象類,抽象類不能被實例化(生成對象);修飾方法的話表示這個方法是個抽象方法,抽象方法沒有方法體;如果一個類包含有一個抽象方法,那么這個類必須是抽象類;如果一個類不包含抽象方法,那么該類也可以被定義成抽象類;抽象類不能被實例化,

46、但卻可以定義引用;抽象類一般需要實現(xiàn)-定義一個子類,并實現(xiàn)抽象方法;抽象類也是有構(gòu)造方法的,因為需要被子類調(diào)用;子類必須實現(xiàn)父類的抽象方法;abstract和final不能共同修飾一個類或方法;例如:定義一個Animal類,就可以定義成抽象類,move()方法可以定義成抽象方法,當(dāng)具體的子類繼承Animal時,再覆蓋move()方法,鳥飛,魚游類的加載觸發(fā)類加載的幾種情況調(diào)用靜態(tài)成員時,會加載靜態(tài)成員真正所在的類及其父類;通過子類調(diào)用父類的靜態(tài)成員時,只會加載父類而不會加載子類;第一次new對象的時候加載(第二次再new同一個類時,不需再加載);加載子類會先加載父類(覆蓋父類方法時所拋出的異常

47、不能超過父類定義的范圍);如果靜態(tài)屬性有final修飾時,則不會加載,當(dāng)成常量使用,例如:public static final int a =123;但是如果上面的等式右值改成表達式(且該表達式在編譯時不能確定其值)時則會加載類,例如:public static final int a = math.PI如果訪問的是類的公開靜態(tài)常量,那么如果編譯器在編譯的時候能確定這個常量的值,就不會被加載,如果編譯時不能確定其值的話,則運行時加載。類加載的順序加載靜態(tài)成員/代碼塊先遞歸地加載父類的靜態(tài)成員/代碼塊(Object的最先),再依次加載到本類的靜態(tài)成員。同一個類里的靜態(tài)成員/代碼塊,按寫代碼的順

48、序加載。如果其間調(diào)用靜態(tài)方法,則調(diào)用時會先運行靜態(tài)方法,再繼續(xù)加載。同一個類里調(diào)用靜態(tài)方法時,可以不理會寫代碼的順序。調(diào)用父類的靜態(tài)成員,可以像調(diào)用自己的一樣,但調(diào)用其子類的靜態(tài)成員,必須使用“子類名.成員名”來調(diào)用。加載非靜態(tài)成員/代碼塊(實例塊在創(chuàng)建對象時才會被加載,而靜態(tài)成員在不創(chuàng)建對象時可以加載)先遞歸地加載父類的非靜態(tài)成員/代碼塊(Object的最先),再依次加載到本類的非靜態(tài)成員。同一個類里的非靜態(tài)成員/代碼塊,按寫代碼的順序加載。同一個類里調(diào)用方法時,可以不理會寫代碼的順序。但調(diào)用屬性時,必須注意加載順序。一般編譯不通過,如果能在加載前調(diào)用,值為默認初始值(如:null或者0)。

49、調(diào)用父類的非靜態(tài)成員(private除外),也可以像調(diào)用自己的一樣。調(diào)用構(gòu)造方法先遞歸地調(diào)用父類的構(gòu)造方法(Object的最先),默認調(diào)用父類空參的,也可在第一行寫明調(diào)用父類某個帶參的。再依次到本類的構(gòu)造方法,構(gòu)造方法內(nèi),也可在第一行寫明調(diào)用某個本類其它的構(gòu)造方法。注意:如果加載時遇到override的成員,可看作是所需創(chuàng)建的類型賦值給當(dāng)前類型。其調(diào)用按多態(tài)用法:只有非靜態(tài)方法有多態(tài);而靜態(tài)方法、靜態(tài)屬性、非靜態(tài)屬性都沒有多態(tài)。假設(shè)子類override父類的所有成員,包括靜態(tài)成員、非靜態(tài)屬性和非靜態(tài)方法。由于構(gòu)造子類時會先構(gòu)造父類,而構(gòu)造父類時,其所用的靜態(tài)成員和非靜態(tài)屬性是父類的,但非靜態(tài)方

50、法卻是子類的,由于構(gòu)造父類時,子類并未加載,如果此時所調(diào)用的非靜態(tài)方法里有成員,則這個成員是子類的,且非靜態(tài)屬性是默認初始值的。1、加載父類靜態(tài)成員/代碼塊2、加載子類靜態(tài)成員/代碼塊3、加載父類非靜態(tài)成員/代碼塊4、加載父類構(gòu)造方法5、加載子類非靜態(tài)成員/代碼塊6、加載子類構(gòu)造方法接口(interface)接口可以通過運用關(guān)鍵字extends被其他接口繼承;當(dāng)一個類實現(xiàn)一個繼承了另一個接口的接口時,它必須實現(xiàn)接口繼承鏈表中定義的所有方法;是一種抽象的數(shù)據(jù)類型,特殊的抽象類;接口中的所有方法都是抽象方法,就算不寫系統(tǒng)也會自動加上abstract,所以一般就省去不寫了;接口中所有的屬性都是fin

51、al static的(靜態(tài)常量),就算不寫系統(tǒng)也會自動加上,所以一般可以省去不寫了;接口也不能被實例化,但可以定義的接口的引用;接口沒有構(gòu)造方法,接口的實現(xiàn)類在生成對象時不會調(diào)用接口的構(gòu)造方法,類的子類在生成對象時一定要調(diào)用父類的構(gòu)造方法(所以子類長的像父類,卻不像接口);一個類只能繼承一個父類,但是可以實現(xiàn)多個接口,用逗號隔開;接口之間可以多繼承;接口=標準:把服務(wù)的使用者和服務(wù)的提供者分開,降低系統(tǒng)的耦合,有效的提高軟件的可擴展性和可維護性;接口聲明中可以聲明變量,它們一般是final和static型的,意思是它們的值不能通過實現(xiàn)類而改變,它們還必須以常量值初始化,如果接口本身定義成pub

52、lic,所有方法和變量都是public的。訪問控制訪問控制(access control)訪問指示符(access specifier)staticfinalabstractpublicprotected默認private頂層類NYYYNYN屬性YYNYNYY方法YYYYYYY局部變量NYNNNNN成員式內(nèi)部類YYYYYYY局部式內(nèi)部類NYYNNNNObject類構(gòu)造方法只有唯一的一個,并且無參。clone()protected clone() throws 創(chuàng)建并返回一個當(dāng)前對象的拷貝,得到和當(dāng)前對象一模一樣的對象。clone()方法滿足:對任何的對象x,都有x.clone()!=x;克隆對

53、象與原對象不是同一個對象了;對任何的對象x,都有x.clone().getClass=x.getClass();克隆對象與原對象的類型一樣;如果對象x的equals方法定義恰當(dāng),那么x.clone().equals(x)應(yīng)該成立。對象克隆過程要讓這個類實現(xiàn)java.lang.Cloneable接口Cloneable接口,指示方法可以合法地對該類實例進行按字段復(fù)制。如果在沒有實現(xiàn)Cloneable接口的實例上調(diào)用Object的clone方法,則會導(dǎo)致拋出CloneNotSupportedException異常。按照慣例,實現(xiàn)此接口的類應(yīng)該使用公共方法重寫Object.clone(它是受保護的)。

54、注意,此接口不包含clone方法。因此,因為某個對象實現(xiàn)了此接口就克隆它是不可能的。即使clone方法是反射性調(diào)用的,也無法保證它將獲得成功。Cloneable接口沒有任何方法,像Cloneable這樣的接口叫做標記接口,即標記這個類的實例可以調(diào)用clone方法,只是起到一個標記的作用。覆蓋Object中的clone()方法,并將訪問權(quán)限改為publicclone();方法的訪問修飾符是protected,這意味著,在子類中直接去super.clone();是可以的,但是如果想在第三方類中去生成一個子類對象后再取調(diào)用clone()時就不可以了,所以這時就得在子類中去覆蓋Object的clone

55、方法,并將訪問控制修飾符改為public。如果只是希望淺復(fù)制,那么使用這樣的代碼就可以完成public Object clone() throws CloneNotSupportedException return super.clone();這段代碼表示,覆蓋Object中的clone方法,將訪問控制修飾符改為public,然后再去調(diào)用Object的clone方法。clone方法有具體的實現(xiàn)步驟代碼,這叫做是實現(xiàn)方法。因為clone方法涉及到底層數(shù)據(jù)的訪問,一般的程序員是沒有辦法寫出這些代碼的,所以用這樣的一個簡單的步驟就可以達到clone的目的了。淺復(fù)制和深復(fù)制概念淺復(fù)制(淺克?。┍粡?fù)制對

56、象的所有變量都含有原來的對象的相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,淺復(fù)制僅僅復(fù)制所考慮的對象,而不是復(fù)制它所引用的對象。深復(fù)制(深克隆)被復(fù)制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復(fù)制過的新對象,而不再是原有的那些被引用的對象。換言之,深復(fù)制把要復(fù)制的對象所引用的對象都復(fù)制了一遍。例如:一個Student對象包含ID,姓名,Teacher等屬性。其中ID為基本類型,姓名為String類型,Teacher為一個Teacher對象。淺復(fù)制只復(fù)制一個新的ID,而姓名和Teacher只復(fù)制地址。即,復(fù)制后的新對象姓

57、名和Teacher仍然指向原先的Stuent的姓名和Teacher。而深復(fù)制會連同姓名和Teacher也同樣復(fù)制出來,并且與原對象的地址不同,指向不同的對象。finalize()構(gòu)造方法負責(zé)對象創(chuàng)建后的初始化,finalize方法負責(zé)對象消亡時的資源釋放;finalize方法被垃圾收集器自動調(diào)用,而垃圾收集器有可能根本不執(zhí)行,所以沒有辦法保證finalize方法一定執(zhí)行。equals(Object obj)下面是Object中的equals方法源碼: public boolean equals(Object obj) return (this = obj); toString()返回該對象的字

58、符串表示。通常,toString 方法會返回一個“以文本方式表示”此對象的字符串。結(jié)果應(yīng)是一個簡明但易于讀懂的信息表達式。建議所有子類都重寫此方法。Object 類的 toString 方法返回一個字符串,該字符串由類名(對象是該類的一個實例)、at 標記符“”和此對象哈希碼的無符號十六進制表示組成。換句話說,該方法返回一個字符串,它的值等于:getClass().getName() + + Integer.toHexString(hashCode()String類及對象池在JDK5.0里面,Java虛擬機在啟動的時候會實例化9個對象池,這9個對象池分別用來存儲8種基本類型的包裝類對象和Str

59、ing對象。對象池的存在是為了避免頻繁的創(chuàng)建和銷毀對象而影響系統(tǒng)性能。對象池是獨立于棧空間和堆空間的,保存著指向一些對象的首地址。String a=hello;首先把hello這個對象創(chuàng)建出來,并保存在堆中。然后對象池會保存一個指向hello的首地址。如果a是某個方法內(nèi)的局部變量,那么也會在棧中將hello的首地址保存在a中。如果a的地址值被賦為null,也就是a不再指向hello了,此時hello并沒有成為垃圾,因為對象池中始終保存了hello的首地址指向hello。而對象池中的那些地址值,程序員是不能直接管理的,那是由JVM才能直接管理的。下次如果需要String b=hello;創(chuàng)建he

60、llo對象,那么b會去對象池中找那些地址值,如果找到了指向hello對象的地址,那么會將這個地址直接賦給b。如果沒有與之匹配的,才會創(chuàng)建新的對象,并同樣將這個對象的首地址保存在對象池中。String c=new String(hello);系統(tǒng)會直接在堆空間中創(chuàng)建一個新的hello對象,而不會去對象池中找,而且這樣創(chuàng)建的新的hello對象也不會保存在對象池去。注意注意:String s=new String(hello);直接只有這條語句的時候,這里的hello作為一個參數(shù)傳給String,而此時沒有hello這個對象,那么:首先會創(chuàng)建一個hello對象,并且將這個hello對象的首地址保存在

溫馨提示

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

最新文檔

評論

0/150

提交評論