java程式設計思想筆記
第一章 物件導論
1,繼承只覆蓋父類的方法,不新增新方法,叫做純粹替代(is-a關係);繼承新增新方法,叫做非純粹替代(is-like-a關係)。
2,多型:同一操作,作用於不同的物件,可以有不同的解釋,產生不同的執行結果,叫做多型。通常表現為:在執行時,通過指向基類的引用來呼叫派生類的方法。
3,選擇容器時,第一要考慮容器的介面和外部行為是否合適,第二要考慮所需操作的效能。
4,客戶端程式設計:(1)指令碼語言:javascript(與java無關)(2)applet/java web start(java編寫)
伺服器程式設計:(1)CGI程式(Perl/Python/c++編寫)(2)servlet程式(java編寫)
第二章 一切都是物件
1,java中,操作物件的識別符號實際上都是物件的一個引用。
2,儲存速度:暫存器 (java不能控制) > 堆疊(儲存基本型別和物件引用) > 堆 (儲存物件) > 非RAM儲存(儲存流物件和持久化物件)
注:常量儲存方式:一般直接存放於程式程式碼內部;在嵌入式系統中,存放於ROM中。
3,Java陣列:基本型別的陣列被初始化為0,其它型別被初始化為NULL。
4,如果一個變數在使用前未初始化,則java編譯器會報錯。
5,java.lang包是java程式預設匯入的包,其中包括了java進行程式設計的基礎類,包括object,math,class,包裝器類,System類,執行緒類等。
第三章 操作符
1,Random rand = new Random(seed);等價於Random rand = new Random();rand.setSeed(seed);
int j = rand.nextInt(100);
注:(1)設定seek會產生固定的隨機數數列,如果沒有設定,則會以當前時間為種子;
(2)rand.nextInt(100),中100為隨機數的上限值,下限值為0;
2,++/- - 是遞增或遞減一個單位,不一定是加減1。
3,比較是否相等(1)基本型別用==(2)包裝器型別和系統定義類,用.equals()(3)其他自定義型別,用覆寫的equals()
注:判斷物件引用是否為null,用==
4,直接常量表示:(1)八進位制:字首為0,(2)16進位制:字首為0x(3)二進位制表示:Integer.toBinaryString()或Long.toBinaryString();(4)Long型:字尾用L,double型:字尾用D,float型:字尾用F
5,指數記數法舉例:double exp = 47e47;
float ft = 1e-43f;注:字尾f必須有,編譯器通常會將指數作為double型別處理
6,java在進行窄化轉換時,預設是截尾操作,可以用Math.round()方法進行四捨五入操作(注:負數的.5是進行捨去操作,例如Math.round(-1.5) = -1,Math.round(-1.6) = -2)(Math.round()其實是先+0.5再進行floor()運算)
7,如果運算溢位,java編譯器不會有任何的出錯警告資訊,這是java編譯器的不足之處之一。
第四章 控制執行流程
1,Math.random()產生大於0小於1的double值
2,可以用Character中static isLowerCase()檢查字元的大小寫。
3,用鍵盤強制中斷死迴圈:ctrl + c
4,foreach用於陣列或者實現Iterable介面的物件遍歷
第五章 初始化與清理
1,(1) tihs只能在方法的內部使用,表示呼叫該方法的那個物件
(2)如果為this添加了引數列表,則表示對符合該引數列表的某個構造器的呼叫
(3)static方法中不存在this
2,(1)正常的資源釋放應該寫在普通的程式碼中,例如:流的關閉
(2)垃圾回收器只有在資源耗盡的情況下才會自動工作
(3)終結處理protected void finalize(){} :垃圾回收器在工作前會先呼叫finalize()方法,所以可以用finalize()來驗證物件的終結條件
(4)finalize()用來清理使用“本地方法 例如C++”所分配的資源
(5)System.gc()用來強制進行終結處理
3,(1)陣列初始化:即使 Integer[] a = new Integer[100],a也只是代表一個引用陣列,在呼叫陣列中元素之前,必須初始化。
(2)Arrays.toString()方法,將陣列轉換為標準的陣列字串
(3)在陣列初始化時,最後一個“,”可有可無,即:int[] a = {1,2,3,}也可以編譯通過
4,可變引數列表格式:void f(int... args) 或 void g(Object... args)
5,列舉型別:public enum Spiciness{NOT,MILD,MEDIUM,HOT,EFAMING }
注:enum型別中會自動加入static values()和ordinal()方法
第六章:訪問許可權控制
1,類的訪問許可權只有public和包訪問許可權
2,訪問許可權修飾符的作用域:
(1)public:包外
(2)protected:不同包的子類
(3)包訪問許可權:包內,類內
(4)private:類內
第七章 : 複用類
1.,組合和繼承的選擇判斷:是否需要從新類向基類進行向上轉型,如果不需要,則應該認真考慮是否需要繼承。
2,(1)編譯期常量:必須是基本資料型別,並且在定義時賦值
(2)對於基本資料型別,final使數值恆定不變;對於物件引用,final使引用恆定不變
(3)final static 修飾的基本資料型別一般用大寫字母命令
(4)可以定義空的final,但在使用前必須初始化
(5)final引數僅可讀,不可修改
(6)final類禁止繼承,final類中的方法都隱式的指定為final,類中的域則不一定
第八章:多型
1,多型時通過後期繫結來實現的(除了static和 final方法外,其他方法都為後期繫結)
2,可以再類中定義一個dispose()函式用來銷燬物件,銷燬的順序和初始化的順序相反
3,編寫構造器的一條有效準則:用盡可能簡單的方法使物件進入正常狀態,儘量避免呼叫非final方法(因為有可能會有多型發生)
第九章:介面
1,介面中的方法預設為 public,域預設為public final static
2,介面卡模式:根據現有的介面,產生需要的介面
3,介面可以通過extends 來擴充套件多個介面
4,可以用介面來建立 常量組,但建議用enum(更強大)
5,在介面中定義的域不能為空,但可以用非常量表達式(eg:隨機數)初始化
6,巢狀介面:為實現某個介面時,不需要實現巢狀在其內部的任何介面。而且,private介面不能在定義它的類之外被實現。
7,工廠方法:定義了一個建立物件的介面,但由子類決定要例項化的類是哪一個。工廠方法讓類把例項化推遲到了子類。
第十章:內部類
1,(1)內部類似乎還只是 一種名字隱藏和組織程式碼的模式
(2)內部類擁有其外圍類的所有元素的訪問權
2,外部類名字.this:返回外部類物件的引用
3,要想建立外部類的物件,必須使用外部類的物件來建立內部類物件,例如:Outer.new inter()
4,如果建立巢狀類(靜態內部類)的物件,則不需要外部類物件的引用。
5,內部類可以對外部類中的private域或方法直接修改或者呼叫,而外部類要訪問內部類的方法則需要通過內部類的物件訪問。
6,可以再方法和作用域中建立內部類,內部類的作用域僅等於建立其的域。
7,如果在方法中定義一個 匿名內部類,並且希望它使用一個在其外部定義的物件,那麼編譯器會要求其引數引用是final的。
8,在匿名內部類中,可以通過例項初始化來達到構造器的效果。
9,普通的內部類物件隱式的儲存了一個引用,指向建立它的外部類物件 。
10,正常情況下 ,不能在介面中放置任何程式碼,但是巢狀類可以作為介面中的一部分,介面中的任何類都自動public和 static
11,內部類可以使多重繼承更加完善
12,閉包 :閉包 是一個可呼叫的物件,它記錄了一些資訊,這些資訊來自於建立它的作用域。內部類是面向物件的閉包。
13,回撥,回撥的價值在於它的靈活性----可以再執行時動態決定要呼叫什麼方法。
14,內部類不能被覆蓋。
15,區域性內部類不能有訪問修飾符,因為它不是外圍類的一部分,但是它可以訪問當前程式碼塊中的常量以及此外圍類的所有成員。
16,區域性內部類僅僅比匿名內部類好在了多了構造器。
第十一章:持有物件
1,@SuppressWarning(unchecked) “不受檢查的異常”的警告資訊應該被抑制
2,新增一組元素:(1)Arrays.asList()返回一個固定大小的list
(2)Collections.addAll()將所有指定元素新增到指定collection中,效率較高
(3)Collention.addAll()引數只能為Collection型別
3,Arrays.asList()(1)返回的list底層實現是 陣列,因此不能改變尺寸
(2)此方法的限制是對所產生的list做了最理想的假設,所以有時候需要顯式型別引數說明,P221詳細討論。
4,可以用Arrays.toString()來引數陣列的可列印列表,而容器可直接列印
5,(1)HashSet/HashMap 是有利於快速獲取元素
(2)TreeSet/TreeMap按照比較結果的升序儲存物件
(3)LinkedHashSet/LinkedHashMap按照被新增的順序儲存物件
6,(1)ArrayList常用於隨機訪問元素,但是在list的中間插入和移除較慢
(2)LinkedList隨機訪問元素較慢,但插入和移除較快
7,Iterator的方法(1)hasNext()(2)next()(3)remove()
listIterator的方法(1)add()(2)hasNext()(3)hasPrevious()(4)next()
(5)nextIndex() (6)previoutIndex()(7)remove()(8)set()替換訪問過的最後一個元素
8,stack和Queue可以用linkedList來作為底層實現。
9,Collentions.shuffle(List<?>list,Random knd)使用指定的隨機源對列表進行置換。
10,java容器結構圖P246
第12章:通過異常處理錯誤
1,所有標準異常類都有兩個構造器,一個是預設無參構造器,另一個是接受一個字串作為引數的構造器,以便能把相關資訊放入異常物件中。
2,根類Throwable的直接子類Error和Exception
3,通常異常物件中僅有的資訊就是異常資訊,除此之外不包含任何有意義的內容
4,獲得異常資訊的4個方法,獲得的資訊量依此遞增(1)getMessage()(2)getLocalizedMessage()(3)toString()(4)printStackTrace()
5,可以用for(StackTraceElement ste : e.getStackTrace())
System.out.println(ste.getMethodName())來訪問棧資訊
6,e.fillInStackTrace(); 返回一個Throwable,重新丟擲異常
7,不需要在異常說明中丟擲RuntimeException異常
8,在異常沒有被當前異常處理程式捕獲的情況下,異常處理機制也會在跳到更高一層的異常處理程式之前,執行finally子句
9,即使在try{}中有return子句,finally{}語句也會執行。
10,java異常的瑕疵為:會導致異常丟失,eg:在finally中包含return子句
限制:在覆蓋方法的時候,只能丟擲基類的異常說明裡 列出的異常
11,(1)如果一個方法同時複寫了基類方法,又實現了介面的方法,那麼該方法所丟擲的異常只能是這兩個方法的異常的交集。
(2)異常限制對構造器不起作用,且子類的構造器的異常說明必須包含基類的構造器的異常說明
(3)派生類的構造器不能捕獲基類構造器所丟擲的異常
(4)派生類可以 不丟擲任何異常
(5)派生類的方法的異常可以由基類的異常派生而來
第13章:字串
1,字串類的定義為:public final class String{}
2,格式化輸出的格式:%[argument_index][flags][width][.pression]conversion
flags:對齊方式:預設是右對齊可以同過 - 改為左對齊
width最小尺寸
.pression最大尺寸
例子:printf("Row1 : [%d %f]\n",x,y);
3,格式化輸出方式(1)System.out.printf();(2)System.out.format();(3)(new Formatter(System.out)).format();
4,型別轉換修飾符d十進位制整數cUnicode字元
bBoolean值sString字串
f浮點數(十進位制整數)e浮點數(科學計數法)
x十六進位制整數h十六進位制雜湊碼
5,String.format()是一個static方法,接受與Formatter.format()方法一樣的引數,但返回一個string物件
6,正則表示式格式:StringpatternStr = ”...“;
Pattern p = Pattern.compile(patternStr);
Matcher m = p.matcher(str);
Matcher查詢匹配的方法:(1)lookingAt()從開始匹配,成功則返回true
(2)find() 從字串中按順序查詢 下一個匹配,成功則返回true
(3)matches()匹配整個字串
(4)replaceAll()替換全部匹配
7,String類中內建的正則表示式的功能(1).matches()(2).split()(3).replaceAll() / .replaceFirst()
8,(1)Scanner的構造器可以接受任何型別的輸入物件
(2)Scanner的預設定界符為\s,可以通過useDelimiter(regex)修改定界符,用delimiter()方法返回 當前正在作為定界符使用的Pattern物件
9,用正則表示式掃描:Scanner.next(pattern);
MatchResult match = Scanner.match();
暫時先複習到第13章,以後的有空再複習!