?? appb.htm
字號:
(31) Java中的繼承具有與C++相同的效果,但采用的語法不同。Java用extends關鍵字標志從一個基礎類的繼承,并用super關鍵字指出準備在基礎類中調用的方法,它與我們當前所在的方法具有相同的名字(然而,Java中的super關鍵字只允許我們訪問父類的方法——亦即分級結構的上一級)。通過在C++中設定基礎類的作用域,我們可訪問位于分級結構較深處的方法。亦可用super關鍵字調用基礎類構建器。正如早先指出的那樣,所有類最終都會從Object里自動繼承。和C++不同,不存在明確的構建器初始化列表。但編譯器會強迫我們在構建器主體的開頭進行全部的基礎類初始化,而且不允許我們在主體的后面部分進行這一工作。通過組合運用自動初始化以及來自未初始化對象句柄的異常,成員的初始化可得到有效的保證。<br>
<br>
1045頁程序<br>
<br>
(32) Java中的繼承不會改變基礎類成員的保護級別。我們不能在Java中指定public,private或者protected繼承,這一點與C++是相同的。此外,在衍生類中的優先方法不能減少對基礎類方法的訪問。例如,假設一個成員在基礎類中屬于public,而我們用另一個方法代替了它,那么用于替換的方法也必須屬于public(編譯器會自動檢查)。<br>
(33) Java提供了一個interface關鍵字,它的作用是創建抽象基礎類的一個等價物。在其中填充抽象方法,且沒有數據成員。這樣一來,對于僅僅設計成一個接口的東西,以及對于用extends關鍵字在現有功能基礎上的擴展,兩者之間便產生了一個明顯的差異。不值得用abstract關鍵字產生一種類似的效果,因為我們不能創建屬于那個類的一個對象。一個abstract(抽象)類可包含抽象方法(盡管并不要求在它里面包含什么東西),但它也能包含用于具體實現的代碼。因此,它被限制成一個單一的繼承。通過與接口聯合使用,這一方案避免了對類似于C++虛擬基礎類那樣的一些機制的需要。<br>
為創建可進行“例示”(即創建一個實例)的一個interface(接口)的版本,需使用implements關鍵字。它的語法類似于繼承的語法,如下所示:<br>
<br>
1046頁程序<br>
<br>
(34) Java中沒有virtual關鍵字,因為所有非static方法都肯定會用到動態綁定。在Java中,程序員不必自行決定是否使用動態綁定。C++之所以采用了virtual,是由于我們對性能進行調整的時候,可通過將其省略,從而獲得執行效率的少量提升(或者換句話說:“如果不用,就沒必要為它付出代價”)。virtual經常會造成一定程度的混淆,而且獲得令人不快的結果。final關鍵字為性能的調整規定了一些范圍——它向編譯器指出這種方法不能被取代,所以它的范圍可能被靜態約束(而且成為嵌入狀態,所以使用C++非virtual調用的等價方式)。這些優化工作是由編譯器完成的。<br>
(35) Java不提供多重繼承機制(MI),至少不象C++那樣做。與protected類似,MI表面上是一個很不錯的主意,但只有真正面對一個特定的設計問題時,才知道自己需要它。由于Java使用的是“單根”分級結構,所以只有在極少的場合才需要用到MI。interface關鍵字會幫助我們自動完成多個接口的合并工作。<br>
(36) 運行期的類型標識功能與C++極為相似。例如,為獲得與句柄X有關的信息,可使用下述代碼:<br>
X.getClass().getName();<br>
為進行一個“類型安全”的緊縮造型,可使用:<br>
derived d = (derived)base;<br>
這與舊式風格的C造型是一樣的。編譯器會自動調用動態造型機制,不要求使用額外的語法。盡管它并不象C++的“new
casts”那樣具有易于定位造型的優點,但Java會檢查使用情況,并丟棄那些“異?!?,所以它不會象C++那樣允許壞造型的存在。<br>
(37) Java采取了不同的異??刂茩C制,因為此時已經不存在構建器??商砑右粋€finally從句,強制執行特定的語句,以便進行必要的清除工作。Java中的所有異常都是從基礎類Throwable里繼承而來的,所以可確保我們得到的是一個通用接口。<br>
<br>
1047頁程序<br>
<br>
(38) Java的異常規范比C++的出色得多。丟棄一個錯誤的異常后,不是象C++那樣在運行期間調用一個函數,Java異常規范是在編譯期間檢查并執行的。除此以外,被取代的方法必須遵守那一方法的基礎類版本的異常規范:它們可丟棄指定的異?;蛘邚哪切┊惓Q苌鰜淼钠渌惓?。這樣一來,我們最終得到的是更為“健壯”的異??刂拼a。<br>
(39) Java具有方法過載的能力,但不允許運算符過載。String類不能用+和+=運算符連接不同的字串,而且String表達式使用自動的類型轉換,但那是一種特殊的內建情況。<br>
(40) 通過事先的約定,C++中經常出現的const問題在Java里已得到了控制。我們只能傳遞指向對象的句柄,本地副本永遠不會為我們自動生成。若希望使用類似C++按值傳遞那樣的技術,可調用clone(),生成自變量的一個本地副本(盡管clone()的設計依然尚顯粗糙——參見第12章)。根本不存在被自動調用的副本構建器。為創建一個編譯期的常數值,可象下面這樣編碼:<br>
static final int SIZE = 255<br>
static final int BSIZE = 8 * SIZE<br>
(41)
由于安全方面的原因,“應用程序”的編程與“程序片”的編程之間存在著顯著的差異。一個最明顯的問題是程序片不允許我們進行磁盤的寫操作,因為這樣做會造成從遠程站點下載的、不明來歷的程序可能胡亂改寫我們的磁盤。隨著Java
1.1對數字簽名技術的引用,這一情況已有所改觀。根據數字簽名,我們可確切知道一個程序片的全部作者,并驗證他們是否已獲得授權。Java
1.2會進一步增強程序片的能力。<br>
(42) 由于Java在某些場合可能顯得限制太多,所以有時不愿用它執行象直接訪問硬件這樣的重要任務。Java解決這個問題的方案是“固有方法”,允許我們調用由其他語言寫成的函數(目前只支持C和C++)。這樣一來,我們就肯定能夠解決與平臺有關的問題(采用一種不可移植的形式,但那些代碼隨后會被隔離起來)。程序片不能調用固有方法,只有應用程序才可以。<br>
(43) Java提供對注釋文檔的內建支持,所以源碼文件也可以包含它們自己的文檔。通過一個單獨的程序,這些文檔信息可以提取出來,并重新格式化成HTML。這無疑是文檔管理及應用的極大進步。<br>
(44) Java包含了一些標準庫,用于完成特定的任務。C++則依靠一些非標準的、由其他廠商提供的庫。這些任務包括(或不久就要包括):<br>
■連網<br>
■數據庫連接(通過JDBC)<br>
■多線程<br>
■分布式對象(通過RMI和CORBA)<br>
■壓縮<br>
■商貿<br>
由于這些庫簡單易用,而且非常標準,所以能極大加快應用程序的開發速度。<br>
(45) Java 1.1包含了Java Beans標準,后者可創建在可視編程環境中使用的組件。由于遵守同樣的標準,所以可視組件能夠在所有廠商的開發環境中使用。由于我們并不依賴一家廠商的方案進行可視組件的設計,所以組件的選擇余地會加大,并可提高組件的效能。除此之外,Java
Beans的設計非常簡單,便于程序員理解;而那些由不同的廠商開發的專用組件框架則要求進行更深入的學習。<br>
(46) 若訪問Java句柄失敗,就會丟棄一次異常。這種丟棄測試并不一定要正好在使用一個句柄之前進行。根據Java的設計規范,只是說異常必須以某種形式丟棄。許多C++運行期系統也能丟棄那些由于指針錯誤造成的異常。<br>
(47) Java通常顯得更為健壯,為此采取的手段如下:<br>
■對象句柄初始化成null(一個關鍵字)<br>
■句柄肯定會得到檢查,并在出錯時丟棄異常<br>
■所有數組訪問都會得到檢查,及時發現邊界違例情況<br>
■自動垃圾收集,防止出現內存漏洞<br>
■明確、“傻瓜式”的異常控制機制<br>
■為多線程提供了簡單的語言支持<br>
■對網絡程序片進行字節碼校驗<br>
</p>
<!--msthemeseparator--><p align="center"><img src="../_themes/inmotion/inmhorsa.gif" tppabs="http://member.netease.com/%7etransbot/Thinking%20in%20Java/_themes/inmotion/inmhorsa.gif" width="300" height="10"></p>
<p align="center"><a href="../../../../tppmsgs/msgs0.htm#1" tppabs="http://www.bruceeckel.com/">英文版主頁</a> | <a href="../index.htm" tppabs="http://member.netease.com/%7etransbot/Thinking%20in%20Java/index.htm">中文版主頁</a> | <a href="../contents/index.htm" tppabs="http://member.netease.com/%7etransbot/Thinking%20in%20Java/contents/index.htm">詳細目錄</a>
| <a href="../about/index.htm" tppabs="http://member.netease.com/%7etransbot/Thinking%20in%20Java/about/index.htm">關于譯者</a></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -