《Java編程思想》(第二版)第6章:重復運用classes

發表于:2007-07-04來源:作者:點擊數: 標簽:
Java 有著眾人贊嘆的功能,程序代碼的重復運用便是其中之一.但是,如果想獲得革命性的改變,你得遠遠超越復制程序代碼,然后改變之的舊式程序代碼的復用途徑:組合(Composition)和繼承(Inheritance) toString():每個非基本類別的對象都具備toString(),當編譯器希
Java有著眾人贊嘆的功能,程序代碼的重復運用便是其中之一.但是,如果想獲得革命性的改變,你得遠遠超越"復制程序代碼,然后改變之"的舊式程序代碼的復用途徑:組合(Composition)和繼承(Inheritance)

toString():每個非基本類別的對象都具備toString(),當編譯器希望的到一個String,而你手上卻只有那些對象的情況下,這個函數便會被喚起.

測試tips:"為每個class提供main(),不管class是不是public",可以在命令行啟動各個main().這樣可以使每個class單元測試更為容易.而且在完成單元測試之后,無須刪除main();你可以將它留下以待日后再加測試.

super關鍵字:你可能會在derived class 的函數中(比如是a())調用base class中的某個函數(通常也是a()),這個時候你當然不能直接調用,因為相同的標志符會造成遞歸.為了解決這個問題,提供了關鍵字super。他代表超類(superclass),所以你可以如此調用:super.a();

base class的初始化:調用base class構造函數。Java編譯器會自動在derived class構造函數中插入對base class默認構造函數的調用動作。但如果你的class不具備default構造函數,或者你想調用帶有引數的base class構造函數,你便得運用關鍵字super,并搭配適當的引數列,明白的寫出調用動作,比如說super(i);(注意這和調用一般成員函數的語法有所不同哦)。此外,對base class構造函數的調用,必須是derived class構造函數所做的第一件事(如果你做錯了,編譯器會提醒你)。

捕捉base構造函數的異常:上面的那個"第一件事"的限制也使得derived class構造函數無法捕捉所有來自base class的異常。有時候這聽不方便的。

保持適當的清理:由于Java中不存在析構函數但是有時候我們希望在對象毀滅的時候做些清理動作,這個時候要把代碼放到final塊中

名稱遮蔽(Name hiding):函數不論被定義與某層class或其base class,Java重載(overloading)機制都可以正常運作。當然,使用"和base class一模一樣的標記(signature)及返回類別"來復寫(override)同名函數,使在尋常不過的事情了,這個也使多態的基礎。

關鍵字final:基本意思是"這是不能被改變的"?;谠O計和效率我們可能希望阻止改變。這兩個理由十分不同,可能夠造成對關鍵字final的誤用??梢允褂胒inal的三個地方:data,method,class。

final data:用來告訴編譯器某塊數據是"固定不變的".用處如下:
1.使用不改變的"編譯器常量(compile-time constant)".
2.可以在執行期(run-time)被初始化,而你卻不想在改變它。
如果某一數據及時static也是final,他們它擁有一塊無法改變的存儲空間。
Blank finals:Java允許產生"留白的finals",即允許我們將數據成員申明為final同時可以不給初值,任何情況下,blank finals必須在使用之前進行初始化,編譯器會強制保證。不過blank finals比final提供了更多的彈性。因為如此class內的final數據成員便可以在每個對象中有所不同。
Final arguments:將引數申明為final,意味著你無法在此函數中令該引數(一個reference)改指他處。
當基本類型引數申明為final時,表示你可以讀取引數所代表的值,但無法改變該值。

final method:使用它的原因有二:
1.鎖住這個函數,保證不被derived class 復寫(override),這是種設計上的考慮。
2.允許編譯器(但此動作不一定產生,編譯器此時會有個判斷動作)將所有對此函數的調用動作轉化為inline(內聯)調用。這是種效率上的考慮。
由于以上兩點同時會起作用,所有有時候你必須權衡一下值不值得用final method:比如說某個函數很小你想把它轉化為內聯函數但是此時它會完全失去被override的可能性。所以最好是在某個函數鎮的體積很小或者你真的不希望他被復寫時,才將他申明為final。
class中的所有private函數自然而然的會是final,因為他們無法被別類取用,更無法被復寫。這說明了一點很重要的性質:覆寫(overriding)只能夠發生在"函數屬于base class接口"時。

final classes:原因是你不希望它被繼承(要么你是處于保密性考慮要么你是出于設計上的考慮)
請注意,不論class是否為final,數據成員data都可以或者為final,或者不為final.
但final class 中的所有函數也都自然是final的了,因為他們不可能被覆寫。


--------------------------------------------------------------------------------

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97