定义:子类可以扩展父类功能,但不可改变父类的功能。
原则一、子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象方法。
原则二、子类可以增加自己特有的方法。
原则三、当子类覆盖或实现父类方法时,方法的前置条件(即方法的形参)要比父类方法的前置条件更宽松。
原则四、当子类覆盖或实现父类方法时,方法的后置条件(即方法的返回值)要比父类方法的后置条件更严格。
比如如下场景,子类覆盖了父类的非抽象方法,不满足李氏替换原则,子类再无机会调用父类的方法。
public class Father {
public int func1(int a, int b) {
return a + b;
}
}
public class Son extends Father {
public int func1(int a, int b) {
return a - b;
}
}
解决方法:将func1重命名为sub即可。
再看如下场景,父类方法的形参比子类的宽松,会导致父类侵入问题:
import java.util.HashMap;
import java.util.Map;
class Father {
public void func1(Map map) {
System.out.println("父类的func1");
}
}
class Son extends Father {
public void func1(HashMap map) {
System.out.println("子类的func1");
}
}
public class Test {
public static void main(String[] args) {
Map map = new HashMap();
Son son = new Son();
son.func1(map);
}
}
注意这里我为了图方便,把3个类写到同一个文件里了。
这里调用son.func1看到输出是父类的,应该把子类的形参改为Map,父类形参改为HashMap,才能调用子类的方法。(不过这里我有一个疑惑,为什么非得用Map map = new HashMap())。
对于原则四的例子只要将形参改为返回值即可演示,这里不再赘述。