Thinking in java notes

topinking發表於2008-07-22

 ============chapter 1 Basic===================

區分基類和派生類的方法:

1.在派生類中新增新的方法

2.在派生類中覆蓋基類的方法

 

是和象的關係

是:完全替換

象:

派生類是否應該只覆蓋基類中的方法。

 

通過使用後繫結來實現動態性

前繫結是編譯器把呼叫在編譯時就解析成絕對地址

後繫結通過特殊程式碼來代替絕對呼叫,程式碼用儲存在物件中的資訊來計算方法的地址。

因此每個物件的執行方式會根據這段特殊程式碼的內容而改變。

後繫結是Java的預設行為

 

upcast:將子類轉成父類的過程。。。。。。(cast表示把東西澆築到模子中去)

當訊息傳送給基類時,會根據具體的子類來呼叫相應的程式碼。

 

 

abstract表示你不想建立一個此類的物件,這個類只是為了表示能使用的介面。

interface是abstract概念的深化。不允許實現任何方法,從而將設計和實現完全分開。

 

 

 

抽象的資料型別==封裝。。

物件的建立、使用、資料儲存和控制其生命週期

1.堆(執行時才知道數量、壽命和確切的型別)還是棧(編寫是知道數量、壽命和確切的型別)

    棧中分配儲存單元只要一個彙編指令,而堆需要依實現而定。

    使用堆是基於物件都是很複雜,建立物件的開銷遠遠大於分配儲存的開銷的假設以及更好的靈活性的假設

    java只使用堆的方式來實現儲存。

2.物件的壽命

   在棧中建立的,編譯器知道其壽命,會自動清理。而在堆中建立的編譯器就不知道其壽命了(為什麼???)

    java中使用垃圾回收的機制。

 

 

Collection和迭代器

儲存分配問題和動態擴容問題。

新增物件和取出物件,取出物件時的問題:每次只能取出一個物件。解決方案:迭代器。

迭代器把集合物件抽象成了一個可以操縱的線性序列。

java1.0和1.1中使用的是Enumeration迭代器。現在用Iterator迭代器,功能更強大。

挑選容器:

1.不同的容器由不同的行為:Stack與List的行為就不同

2.不同的容器進行同一操作時由不同的效率:List、ArrayList和LinkedList

 

 

單根繼承體系

從0開始,最好是單根繼承。融合第三方類庫,可以考慮多重繼承或者介面卡模式。

單根繼承可以保證所有物件都有某種功能

單根繼承可以使垃圾回收的實現變得更加容易

所有物件都提供執行時的型別資訊,不會碰到無法判斷物件型別的情況。這對異常處理之類的功能很有幫助。

 

 

下傳和型別轉換

把丟失的身份資訊找回來。。

必須取得物件的reference和相應的型別資訊。

下傳的型別檢查使程式的效能降低。也加重了程式編寫的負擔。

引數化型別機制使得可以方便的獲取型別的資訊

 

 

確保正確的清除

java的垃圾回收機制僅僅處理記憶體問題而不涉及到清除物件的其他方面【單根繼承,只能用堆來建立物件】

所有能簡化程式設計的東西都是以犧牲效能為代價的【在棧中的清理和分配都是自動的,但是失去了按需建立的能力】

單根繼承和多型性也影響效能

沒有辦法知道什麼時候呼叫垃圾回收程式,不能用於實時系統。

 

 

 

異常處理

絕大多數的異常處理方案都有一個問題,不是由語言強制的而要靠開發人員去遵守。

異常肯定能在某個地方得到處理,還提供了一種可靠的從錯誤狀態下恢復的機制

Java的異常處理是從底層支援的,但是它不是一種物件導向的特性

 

 

 

併發

 

 

 

 

Persistence

Java提供輕量級persistence支援。

可以通過序列化或者jdo來實現。

 

 

 

Web

C/S

伺服器:資訊庫、分發資訊的軟體和儲存資訊和分發資訊的軟體的機器合起來稱為伺服器。

關鍵:伺服器儲存資訊並能把資訊分發到客戶端。

事務處理。

軟體維護。

多系統、多硬體支援。

效能問題。

為了降低延時,將大多數處理放到客戶端。

 

B/S

 

客戶端程式設計:html,python,perl

外掛:客戶端程式設計最重要的步驟之一。提供了客戶端程式設計的後門

.NET平臺(JVM和Java類庫)和C#(Java)

安全性:java的sandbox,沒有檔案IO,applet的電子簽名框架

 

先用java寫,再翻譯成C++。。。。

 

 

JIT,HostSpot

 

 

 

============chapter 2 萬物皆物件===================

Java是更純粹的面嚮物件語言。

C++和java都是混合語言

C和C++必須知道是在用物件還是引用,Java中一切都是物件,通過物件的引用來操縱。

物件引用也可以單獨存在。此時只建立了一個引用而沒有建立物件。

 

你必須建立所有物件

    建立引用後就得連結到物件:引用初始化。

資料儲存地:

    暫存器(數量有限,由編譯器分配)

    棧:CPU通過棧指標來訪問,物件的引用放在棧內

    堆:靈活,慢

    靜態儲存:在整個程式執行期間都可以訪問。

    固定儲存:常量值

    非記憶體儲存:獨立於程式。persistance 和 stream

特例:primitive型別

    非引用型別,放在棧中。有對應的Wrapper類別。

高精度數值:BigDecimal,BigInteger 支援任意精度

Java中的陣列:

    自動初始化,null或者基本型別值。

    邊界檢查

 

你永遠都不需要清理物件:

 作用域:作用域由{}來表示,在作用域內定義的變數只能用到這個作用域結尾。

 在Java中不能象C和C++一樣隱藏變數{int x = 0;{int x=0;}}

物件的作用域:{string str = "1111";}

   str會在作用域結束後消失,但是物件"1111"不會,要等待垃圾收集工具。

 

 

 

 

 

 

============chapter 7 多型性===================

多型性提供了另一個層面的實現和介面的分離,即分離做什麼和怎麼做。。

隱藏實現通過將細節設計成private來實現實現和介面的分離。

多型方法呼叫可以讓類表現出各自所獨有的特點。

多型性:dynamic binding

後繫結:late binding

執行時繫結:run-time binding

相關文章