這個程序看起來也許顯得有些奇怪。為什麼所有人都應該有意忘記一個對象的類型呢?進行上溯造型時,就可能產生這方面的疑惑。而且如果讓tune()簡單地取
將一個方法調用同一個方法主體連接到一起就稱為“綁定”(Binding)。若在程序運行以前執行綁定(由編譯器和鏈接程序,如果
知道Java裡綁定的所有方法都通過後期綁定具有多形性以後,就可以相應地編寫自己的代碼,令其與基礎類溝通。此時,所有的衍生類都保證能用相同的代碼正常
現在,讓我們仍然返回樂器(Instrument)示例。由於存在多形性,所以可根據自己的需要向系統裡加入任意多的新類型,同時毋需更改true()方法
現在讓我們用不同的眼光來看看本章的頭一個例子。在下面這個程序中,方法play()的接口會在被覆蓋的過程中發生變化。這意味著我們實際並沒有&ldqu
在我們所有樂器(Instrument)例子中,基礎類Instrument內的方法都肯定是“偽”方法。若去調用這些方法,就會
“interface”(接口)關鍵字使抽象的概念更深入了一層。我們可將其想象為一個“純”抽象類。它
接口只是比抽象類“更純”的一種形式。它的用途並不止那些。由於接口根本沒有具體的實施細節——也就是說
利用繼承技術,可方便地為一個接口添加新的方法聲明,也可以將幾個接口合並成一個新接口。在這兩種情況下,最終得到的都是一個新接口,如下例所示:&nbs
由於置入一個接口的所有字段都自動具有static和final屬性,所以接口是對常數值進行分組的一個好工具,它具有與C或C++的enum非常相似的效
接口中定義的字段會自動具有static和final屬性。它們不能是“空白final”,但可初始化成非常數表達式。例如:&n
在Java 1.1中,可將一個類定義置入另一個類定義中。這就叫作“內部類”。內部類對我們非常有用,因為利用它可對那些邏輯上
迄今為止,內部類看起來仍然沒什麼特別的地方。畢竟,用它實現隱藏顯得有些大題小做。Java已經有一個非常優秀的隱藏機制——只
至此,我們已基本理解了內部類的典型用途。對那些涉及內部類的代碼,通常表達的都是“單純”的內部類,非常簡單,且極易理解。然而
迄今為止,我們見到的內部類好象僅僅是一種名字隱藏以及代碼組織方案。盡管這些功能非常有用,但似乎並不特別引人注目。然而,我們還忽略了另一個重要的事實
為正確理解static在應用於內部類時的含義,必須記住內部類的對象默認持有創建它的那個封裝類的一個對象的句柄。然而,假如我們說一個內部類是stat
若想生成外部類對象的句柄,就要用一個點號以及一個this來命名外部類。舉個例子來說,在Sequence.SSelector類中,它的所有方法都能產
由於內部類構建器必須同封裝類對象的一個句柄聯系到一起,所以從一個內部類繼承的時候,情況會稍微變得有些復雜。這兒的問題是封裝類的“秘密&
若創建一個內部類,然後從封裝類繼承,並重新定義內部類,那麼會出現什麼情況呢?也就是說,我們有可能覆蓋一個內部類嗎?這看起來似乎是一個非常有用的概念
由於每個類都會生成一個.class文件,用於容納與如何創建這個類型的對象有關的所有信息(這種信息產生了一個名為Class對象的元類),所以大家或許