里氏代换原则:
通俗来讲:子类可以扩展父类的功能,但不能修改父类的功能。即子类继承父类时,除添加新的方法完成新增功能外,不能重写父类的方法。
里氏替换原则的主要作用如下。
- 里氏替换原则是实现开闭原则的重要方式之一。
- 它克服了继承中重写父类造成的可复用性变差的缺点。
- 它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。
言简意赅:儿子要听老爸话,可以比老爸懂得多,但不能违背老爸的意志!
几维鸟是一种特殊的鸟类,不具备飞行能力,即speed为0,理所当然飞行时间也为0,若继承鸟类,则必须重写speed方法,令speed=0,那么飞行时间flytime方法的计算结果为Infinity!
解决方案:根据里氏代换原则,子类重写父类方法很容易出现问题,不如再定义animal大类,其包括的方法有奔跑速度和奔跑时间。让几维鸟继承该类。
package principle;
public class LSPtest
{
public static void main(String[] args)
{
Bird bird1=new Swallow();
Bird bird2=new BrownKiwi();
bird1.setSpeed(120);
bird2.setSpeed(120);
System.out.println("如果飞行300公里:");
try
{
System.out.println("燕子将飞行"+bird1.getFlyTime(300)+"小时.");
System.out.println("几维鸟将飞行"+bird2.getFlyTime(300)+"小时。");
}
catch(Exception err)
{
System.out.println("发生错误了!");
}
}
}
//鸟类
class Bird
{
double flySpeed;
public void setSpeed(double speed)
{
flySpeed=speed;
}
public double getFlyTime(double distance)
{
return(distance/flySpeed);
}
}
//燕子类
class Swallow extends Bird{}
//几维鸟类
class BrownKiwi extends Bird
{
public void setSpeed(double speed)
{
flySpeed=0;
}
}