通俗的定義:子類可以擴(kuò)展父類的功能施掏,但不能改變父類原有的功能
子類可以實(shí)現(xiàn)父類的抽象方法椿争,但是不能覆蓋父類的非抽象方法硼莽。
為什么這么說(shuō)呢?先看看違背的話會(huì)出現(xiàn)什么情況:
新建一個(gè)父類Father朴上,里面一個(gè)doSomething(int a垒棋,int b)方法
public int doSomething(int a, int b) {
return a + b;
}
新建一個(gè)子類Son繼承Father類,里面同樣寫(xiě)一個(gè)doSomething(int a痪宰,int b)方法叼架,這里我們將父類方法進(jìn)行重寫(xiě)
public int doSomething(int a, int b) {
return a * b;
}
新建一個(gè)Client類,用來(lái)測(cè)試代碼
public static void main(String[] args) {
Son son = new Son();
System.out.println(son.doSomething(3,1));
}
可以看到控制臺(tái)打出‘3’衣撬,因?yàn)閳?zhí)行的是子類的方法乖订,他重寫(xiě)了父類的doSomething方法,也許你系統(tǒng)正好要使用的就是a-b的功能具练,而你卻輸出了a乘b的功能乍构,這樣對(duì)系統(tǒng)造成潛在風(fēng)險(xiǎn),如果一定要有a*b整個(gè)功能扛点,可以看下面一條哥遮,直接子類中增加自己特有的方法即可。
子類中可以增加自己特有的方法陵究。
這個(gè)就不需要再說(shuō)明了
當(dāng)子類覆蓋或?qū)崿F(xiàn)父類的方法時(shí)眠饮,方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松。
這里同樣用代碼說(shuō)明畔乙,如果違背會(huì)怎么樣:
新建一個(gè)父類Father君仆,里面一個(gè)doSomething(Map m)方法
public void doSomething(Map m) {
System.out.println("父類方法");
}
新建一個(gè)子類Son繼承Father類翩概,里面同樣寫(xiě)一個(gè)doSomething(HashMap m)方法牲距,注意這里可不是重寫(xiě)哦,它們參數(shù)不一樣钥庇,所以為重載
public int doSomething(HashMap m) {
System.out.println("子類方法");
}
新建一個(gè)Client類牍鞠,用來(lái)測(cè)試代碼
public static void main(String[] args) {
Son son = new Son();
son.doSomething(new HashMap());
}
可以看到控制臺(tái)打出‘子類方法’,這里會(huì)出現(xiàn)很大問(wèn)題评姨,問(wèn)題在于子類并沒(méi)有去重寫(xiě)父類的doSomething方法难述,但是卻調(diào)用的是子類這個(gè)方法萤晴,因此同樣會(huì)對(duì)于系統(tǒng)造成潛在風(fēng)險(xiǎn)
當(dāng)子類的方法實(shí)現(xiàn)父類的抽象方法時(shí),方法的后置條件(即方法的返回值)要比父類更嚴(yán)格胁后。
這里也不需要過(guò)多說(shuō)了店读,子類的返回類型必須小于或等于父類抽象方法的返回類型