1.里氏替换原则
派生类(子类)对象可以在程序中代替其基类(超类)对象。
这意味着在使用继承的时候,子类不能修改父类已有的行为,而只能扩展父类的功能。
2.示例
【Liskov.java】
package com.sdnu;
public class Liskov {
public static void main(String[] args) {
A a = new A();
System.out.println("20 - 5 = " + a.fun1(20, 5));//本意是a的20 - 5
System.out.println("20 - 6 = " + a.fun1(20, 6));//本意是a的20 - 6
//因为B继承了A,我们本意想在B中调用父类的方法,忘记B中重写了父类方法
B b = new B();
System.out.println("20 - 5 = " + b.fun1(20, 5));//本意是b的20 -5
System.out.println("20 - 6 = " + b.fun1(20, 6));//本意是b的20 -6
System.out.println("20 - 5 + 10 = " + b.fun2(20, 5));//本意是20 -5 + 10
}
}
class A {
public int fun1(int num1, int num2){
return num1 - num2;
}
}
class B extends A {
//假如我们忘记了我们已经重写了fun1方法
public int fun1(int num1, int num2){
return num1 + num2;
}
public int fun2(int num1, int num2){
return fun1(num1, num2) + 10;
}
}
3.改进
【Liskov.java】
package com.sdnu.improve;
public class Liskov {
public static void main(String[] args) {
A a = new A();
System.out.println("20 - 5 = " + a.fun1(20, 5));//本意是20 - 5
System.out.println("20 - 6 = " + a.fun1(20, 6));//本意是20 - 6
B b = new B();
System.out.println("20 + 5 = " + b.fun1(20, 5));//本意是20 + 5
System.out.println("20 + 6 = " + b.fun1(20, 6));//本意是20 + 6
System.out.println("20 + 5 + 10 = " + b.fun2(20, 5));//本意是20 + 5 + 10
}
}
class Base {
//公共部分
}
class A extends Base{
public int fun1(int num1, int num2){
return num1 - num2;
}
}
class B extends Base{
public int fun1(int num1, int num2){
return num1 + num2;
}
public int fun2(int num1, int num2){
return fun1(num1, num2) + 10;
}
}