Java中的方法在繼承中的表現
一、對於普通的類(非最終類,抽象類)
可見的屬性和方法都能夠被繼承,我們這裡主要討論方法。
那麼什麼是可見的方法?
1.private修飾的方法肯定是不可見的,私有方法只能在本類中進行訪問。
2.無修飾符(預設許可權),本包的類可以訪問,包外的類不可訪問。就是說一個類繼承了包外的一個類,那麼對於父類的預設許可權的方法,它是繼承不到的。
3.protected修飾的方法,本包下的類可以訪問,包外的子類也能訪問。
4.public修飾的方法,所有類可以訪問。
普通成員方法在繼承中的表現:
1.是否可以被繼承? 是
2.重寫的結果? 覆蓋
父類:
public class Father {
// doSomething
public void doSomething() {
System.out.println("fathers do something.");
}
}
子類:
public class Son extends Father {
@Override
public void doSomething() {
System.out.println("sons do something.");
}
}
測試類:
public class TestMethodIninheritance { public static void main(String[] args) { Father f = new Son(); f.doSomething(); } }
結果是:
被呼叫的被重寫例項方法的版本是子類中的版本。
靜態成員方法在繼承中的表現:
1.是否可以被繼承? 是
2.重寫的結果? 隱藏 好像不能叫重寫,因為加了Override註解就報錯。不過這裡父類的方法確實不是覆蓋掉了
父類:
public class Father { // doSomething public static void doSomething() { System.out.println("fathers do something."); } }
子類:
public class Son extends Father {
public static void doSomething() {
System.out.println("sons do something.");
}
}
測試類:
public class TestMethodIninheritance {
public static void main(String[] args) {
Father f = new Son();
f.doSomething(); // 不建議這樣呼叫靜態方法
}
}
結果是:
被呼叫的隱藏靜態方法的版本取決於它是從超類還是子類呼叫的。
靜態方法是和它的類相關聯的方法,而不是與任何物件相關聯的方法。
二、對於介面
介面中的變數都是常量,介面中的方法都是抽象方法。
在java8中,介面中增加了靜態方法和預設實現方法,這兩中方法可以有方法體。
靜態方法在繼承(實現)中的表現:
是否可以被繼承? 否
為了找這個問題的答案費了很大力氣,因為本人的英語也是有點菜,而且關於這個特點的介紹只有短短几個單詞!!!
在百十行英文中找這麼幾個單詞也是很難受。。。
連結:
普通方法(抽象)在繼承中的表現:
是否可以被繼承? 是 子類必須實現所有的抽象方法,不然該子類就是抽象類
預設實現方法在繼承中的表現:
是否可以被繼承? 是
但是這裡也存在著一個問題:我們都知道介面是可以多實現的,那麼如果子類實現的兩個介面中,有方法簽名相同的預設實現方法,那麼繼承的是哪一個呢?
首先這種情況會產生編譯錯誤。這時候我們就必須重寫同簽名方法中的一個,表示使用哪個介面中的方法:
介面1:Animal
public interface Animal {
// 預設實現喝水方法
default void drink() {
System.out.println("drink water.");
}
}
介面2:Human
public interface Human {
default void drink() {
System.out.println("drink boiled water.");
}
}
實現類:Man
public class Man implements Animal, Human {
@Override
public void drink() {
Animal.super.drink();
}
}
我們可以通過這種方式:類名.super.方法名();表示繼承了指定父介面的指定方法。