继承的优缺点 :
优点 :
新的实现很容易,因为大部分是继承而来的
很容易修改和扩展已有的实现
提高了代码的复用性
让类与类之间产生了关系,是“多态性”的前提
缺点:
打破了封装,因为基类向子类暴露了实现细节
白盒重用,因为基类的内部细节通常对子类是可见的
当父类的实现改变时可能要相应的对子类做出改变
不能在运行时改变由父类继承来的实现
由此可见,组合比继承具有更大的灵活性和更稳定的结构,一般情况下应该优先考虑组合。
只有当下列条件满足时才考虑使用继承:
子类是一种特殊的类型,而不只是父类的一个角色
子类的实例不需要变成另一个类的对象
子类扩展,而不是覆盖或者使父类的功能失效
多态的优缺点:
优点:
A:提高了代码的维护性(继承保证)
B:提高了代码的扩展性(由多态保证)
是提高了代码的扩展性。比如上面的例子中,如果添加了Pig,Mouse等动物,函数DoSomething()仍然可以使用。
弊端:
是不能使用子类中的特有的方法。比如上面例子中,Dog和Cat的共有方法是Eat,这样Animal中仅仅能有Eat,而不能有其它。
多态的前提,是父类和子类之间有继承关系,且子类中方法覆盖了父类中方法。
向上转型:Fu f = new Zi();
向下转型:Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。
抽象的特点:
1 如果定义了抽象方法,那么必须定义抽象类;如果定义了抽象类,则不一定有抽象方法。抽象方法和抽象类用abstract关键字修饰。
2 抽象类不能实例化,也就是说不能用new关键字创建对象。
3 只有当子类覆盖了“所有”的抽象方法后,子类才能实例化。否则,子类仍然是一个抽象类。
4 抽象类是基于具体类向上抽取得到的。
接口的特点:
1 接口不能直接实例化,需要有子类,子类才可能实例化。
2 当子类覆盖了接口中所有抽象函数的时候,子类才可以实例化。
3 父类和子类的关系,可以用“继承”来形容;接口和子类的关系,可以用“实现”来形容。