换句话来说,只要是猴类适用的,猕猴和石猴都适用,这其实就是里式替换原则。
这是第一种解释,还有第二个更加通俗易懂的解释: 所有引用基类的地方必须能透明地使用其子类的对象。
第二种定义比较通俗,容易理解:只要有父类出现的地方,都可以用子类来替代,而且不会出现任何错误和异常。但是反过来则不行,有子类出现的地方,不能用其父类替代。
实例代码 :
public class TestA {
public void fun(int a,int b){
System.out.println(a+"+"+b+"="+(a+b));
}
public static void main(String[] args) {
System.out.println("父类的运行结果");
TestA a=new TestA();
a.fun(1,2);
//父类存在的地方,可以用子类替代
//子类B替代父类A
System.out.println("子类替代父类后的运行结果");
TestB b=new TestB();
b.fun(1,2);
}
}
class TestB extends TestA{
@Override
public void fun(int a, int b) {
System.out.println(a+"-"+b+"="+(a-b));
}
}
大家肯定也都能猜出来结果是什么样子的
父类的运行结果
1+2=3
子类替代父类后的运行结果
1-2=-1
Process finished with exit code 0
我们想要的结果是“1+2=3”。可以看到,方法重写后结果就不是了我们想要的结果了,也就是这个程序中子类B不能替代父类A。这违反了里氏替换原则原则,从而给程序造成了错误。
子类中可以增加自己特有的方法
这个很容易理解,子类继承了父类,拥有了父类和方法,同时还可以定义自己有,而父类没有的方法。这是在继承父类方法的基础上进行功能的扩展,符合里氏替换原则。
public class TestA {
public void fun(int a,int b){
System.out.println(a+"+"+b+"="+(a+b));
}
public static void main(String[] args) {
System.out.println("父类的运行结果");
TestA a=new TestA();
a.fun(1,2);
//父类存在的地方,可以用子类替代
//子类B替代父类A
System.out.println("子类替代父类后的运行结果");
TestB b=new TestB();
b.fun(1,2);
b.newFun();
}
}
class TestB extends TestA{
public void newFun(){
System.out.println("这是子类的新方法...");
}
}
这次运行出来的代码结果就是我们意料中的内容了
父类的运行结果
1+2=3
子类替代父类后的运行结果
1+2=3
这是子类的新方法...
Process finished with exit code 0
AVA语言对里式替换原则支持的局限 :
JAVA编译器的检查是有局限性的,为什么呢?举个例子来说,描述一个物体大小的量有精度和准确度两种属性。所谓的精度,就是这个量的有效数字有多少位;而所谓的精准度,是这个量与真实的物体大小相符合到什么程度。
一个量可以有很高的精度,但是却无法与真实物体的情况相吻合,JAVA语言编译器能够检查的,仅仅是相当于精度的属性而已,它没有办法去检查这个量与真实物体的差距。
换一句话来说,JAVA编译器不能检查一个系统在实现和商业逻辑上是否满足里式替换原则。
而里式替换原则在设计模式中也有体现,请关注我们的知识星球,链接在文末,我们将每周更新一篇关于设计模式的文章。
本文地址:网络百科频道 https://www.eeeoo.cn/wangluo/903083_2.html,嗨游网一个专业手游免费下载攻略知识分享平台,本站部分内容来自网络分享,不对内容负责,如有涉及到您的权益,请联系我们删除,谢谢!