隱藏變數
在一個類裡,如果一個變數的名字和父類的變數的名字一樣,即使他們的類型不一樣,那麼在子類中,父類的同名變數無法直接通過變數名訪問。
但是,父類的同名變數可以通過super訪問。一般來說,不推薦隱藏變數,這樣會讓代碼難以閱讀
覆蓋和隱藏方法
對象執行個體方法
在一個對象執行個體方法中,如果子類有一個方法,它的簽名(方法名字,方法的參數個數和類型)和傳回值都和父類一樣,那麼就是覆蓋父類的方法。
子類覆蓋的能力,允許一個類,繼承父類的行為,根據需要修改某些行為。覆蓋的方法,和父類對應的方法有一樣的名字,一樣的參數類型和個數,一樣的傳回型別。另一種覆蓋方法可以返回父類的方法的傳回型別的子類。這個稱之為covariant傳回型別。
當覆蓋一個方法,你要使用註解@Override,告訴編譯器你要覆蓋父類的方法。但是,如果該方法不存在父類中,那麼編譯器會報錯。
類方法
如果子類聲明了一個與父類相同簽名的類方法,子類隱藏了父類的方法。
隱藏和覆蓋的區別具有很大的意義。覆蓋方法的調用版本就是子類的方法。隱藏方法的調用版本,依賴於它是被父類調用,還是被子類調用。
下面有個例子,示範對象執行個體方法和類方法的區別,第一個類是Animal
public class Animal { public static void testClassMethod() { System.out.println("The class" + " method in Animal."); } public void testInstanceMethod() { System.out.println("The instance " + " method in Animal."); }}
第二個類是Cat,它是Animal的子類:
public class Cat extends Animal { public static void testClassMethod() { System.out.println("The class method" + " in Cat."); } public void testInstanceMethod() { System.out.println("The instance method" + " in Cat."); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); }}
Cat類覆蓋了Animal的執行個體方法,並隱藏了它的類方法。結果輸出如下:
The class method in Animal.The instance method in Cat.
和之前所說的一樣,由於是通過父類調用隱藏方法,所以隱藏方法的調用版本是父類。而覆蓋方法的調用版本是子類的方法。
修飾符
覆蓋的存取修飾詞可以允許擴大,但不允許縮小。例如,一個protected對象方法,可以在子類中修改為public,但不能是private。否則代碼會在編譯時間出錯。
方法覆蓋和隱藏小結
下面的表格總結了在子類聲明了一個與父類簽名一樣的方法的各種情況
|
Superclass Instance Method |
Superclass Static Method |
Subclass Instance Method |
Overrides |
Generates a compile-time error |
Subclass Static Method |
Generates a compile-time error |
Hides |