1. 程式人生 > >Java中的方法在繼承中的表現

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中,介面中增加了靜態方法和預設實現方法,這兩中方法可以有方法體。

靜態方法在繼承(實現)中的表現:

是否可以被繼承?  否

為了找這個問題的答案費了很大力氣,因為本人的英語也是有點菜,而且關於這個特點的介紹只有短短几個單詞!!!

在百十行英文中找這麼幾個單詞也是很難受。。。

連結:

Overriding and Hiding Methods

普通方法(抽象)在繼承中的表現:

是否可以被繼承? 是    子類必須實現所有的抽象方法,不然該子類就是抽象類

預設實現方法在繼承中的表現:

是否可以被繼承?   是

但是這裡也存在著一個問題:我們都知道介面是可以多實現的,那麼如果子類實現的兩個介面中,有方法簽名相同的預設實現方法,那麼繼承的是哪一個呢?

首先這種情況會產生編譯錯誤。這時候我們就必須重寫同簽名方法中的一個,表示使用哪個介面中的方法:

介面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.方法名();表示繼承了指定父介面的指定方法。