1. 程式人生 > >複用類即多型性的體現

複用類即多型性的體現

一,繼承語法

1,成員預設的訪問許可權是包,包內其他類都可以訪問;而繼承其他的類只能訪問public成員;為了繼承,一般性規則是,把資料成員變數設定為private,使之不能被訪問

2,繼承的方法被覆蓋之後不能在本方法直接被呼叫,否則會產生遞迴,這不是我們期望看到的結果,一般情況下會使用super呼叫基類版本的方法

3,在繼承過程中,不一定非要使用基類的方法,也可以新增新的方法和變數

4,初始化,構建過程是從基類嚮導出類擴散的,但是使用的是預設的無引數構造器

5,如果想呼叫有引數的構造器,就必須用關鍵字super顯示的呼叫基類構造器,並配以適當的引數列表;而且呼叫基類構造器必須是你匯出類構造器所做的第一件事,如果你錯了,編譯器會提醒你

二,代理

Java沒有提供對他的直接支援,是繼承和組合的中庸之道。如果直接使用繼承會暴露基類中的所有方法。用代理的話,不會繼承基類中的方法,但是會建一個基類成員物件,也會在本類中建立與基類中相同的方法,通過這些方法名相同的方法呼叫基類中的方法。(事實上不應該稱之為基類);

解構函式是一種在物件被銷燬時可以被自動呼叫的函式,而在Java中沒有這種函式的概念

有時候類需要可能要在其生命週期之內執行一些必要的清理活動。正如在前面的《初始化與清理》中所說,你並不知道垃圾回收器什麼時候慧會被呼叫,甚至會不會被呼叫。因此如果你想清理一些東西,,就必須顯示的編寫一個特殊的方法來做這件事,並且要確保客戶端程式設計師知曉他們必須要呼叫這個方法。

在本類清理方法總還必須注意基類清理方法和成員物件清理方法的呼叫順序,以防止某一個子物件依賴於另一個子物件的情況發生。一般而言,先執行類的所有特定的清理動作,其順序與生存的順序正好相反(通常這就要求基類物件任然存活),然後就是呼叫基類的清理方法

需要注意,除了記憶體之外,不能依賴垃圾回收器去做任何事。如果需要處理,最好是編寫你自己的清理方法,但不要使用finalize

在匯出類中過載一個基類中的方法,完全不影響基類中過載方法的使用,而@Override可以防止在你不想要過載時進行了過載

{CompileTimeError}標籤。。。。未完,待續

三,在組合和繼承之間選擇

子物件:駐留在另一個物件中的物件,在一個類的定義中,宣告另一個類的物件來作為成員變數

組合技術就是在新類之中嵌入某一個現有的類,最好是private修飾的

protected修飾的類成員,對於類使用者來說他是private,但是對於同一個包內的或者匯出類而言他卻是可以訪問的,但是最好還是修飾成員變數為private,你應該一直保留修改底層實現的權利,用protected來控制類的繼承者的訪問許可權

四,向上轉型

 

基類中有的方法,匯出類也有,可以確保向上轉型可以進行。

從一個較專用轉換為一個較普通型別

繼承要慎用,其使用場合僅限於該技術確實有效的情況下,一個清晰的判斷方法是問一問自己是否需要進行向上轉型

五,final

可以用來定義編譯器常量,在編譯器就可以把常量值代入計算式,並執行,這樣就減輕了一些執行時負擔。這些常量必須是基本資料型別

一個即是static又是final修飾的域只是佔用了不能改變的儲存空間,定義為static一位置只有一份

對於物件引用,final使之引用恆定不變,,一旦引用被初始化指向一個物件,,就無法把他改為指向另一個物件,然而對於物件自身卻是可以修改的,Java並未提供使任何物件恆定不變的途徑,這一限制同樣適用於陣列,他同樣是物件

也可以在引數列表中使用final,以為著無法再方法中改變引用所指向的物件

使用final方法,一個原因是效率,如果一個方法被指定為final,那麼就是同意編譯器針對該方法的所有呼叫,都轉為內嵌呼叫,另一個原因是防止被子類覆蓋

但是在Java的最近版本中,已經不需要final的優化機制,應該讓編譯器和虛擬機器來處理優化問題。

由於private方法預設是final修飾,無法觸及而且能有效隱藏,所以除了把他看成是 因為它所屬的類的組織結構的原因而存在外,其他任何事物都可以不考慮它

final類表明不打算繼承該類,也不打算對其作出改變,也不允許別人這樣做,或者出於安全的考慮,不希望它有子類