1. 程式人生 > >java程式設計思想筆記

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章,以後的有空再複習!奮鬥奮鬥奮鬥