多态
多态的基础概念
- 里氏替换原则:任何基类可以出现的地方,子类一定可以出现(子类对象可以替换父类对象)
- 即父类类型的变量可以引用子类对象
- extends 关键字不翻译为继承,实质的正确翻译是扩展 a.子类可以扩展出父类没有的方法 b.子类可以覆盖重写父类现有的方法
- 子类对象可以替换父类对象的原因是子类的范围和能力要大于或等于父类 a.子类继承了父类,拥有了父类的属性和方法,所以子类至少等于父类,父类有子类也有. b.子类可以扩展和重写父类的方法,所以父类没有的,子类也可以有.
- 子类方法中注意区分重写和重载.
- 对象在调用方法时,需要受到对象本身的类型限制,父类的引用不能调用子类的方法.
- 以交通工具为例子,rehile,benzmbw(run方法).
使用父类类型作为参数
- 通过 Trainner,Dog,penguin的例子,用重载的方式实现feed方法.
- 如果新增一种动物,则以上程序不符合OCP原则 a.ocp:open closed princlple b.指对扩展开放,对修改关闭.
- 通过多态来修改上面的例子.
- 多态 同一类对象的相同行为有着不同的表现形式(世界是多彩缤纷的).
- 多态能够提高代码的可扩展性和可维护性,减少代码量
- 实现多态的手法: a.子类继承父类 b.子类重写父类方法 c.父类类型可以引用不同的子类对象实现动态替换.
- 设计原则:依赖与抽象,不依赖于具体 a.抽象的东西更加可靠,适应范围广 b.像生活中的语言艺术(即没有把话说死) c.ocp中的多态也一样,没有把类型写死,可以用其他子类型来替换,程序就灵活了.
向上转型和向下转型
- 基本数据类型有转换,引用类型的数据也有类型转换
- 向上转型 a.将一个父类的引用指向一个子类对象,称为向上转型,自动进行类型转换. b.即子类型转换父类型 c.无需强制类型转换,直接接收即可. d.转换过程是安全的,不会出现类型转换错误的异常. e.有可能会损失部分子类新增的方法,因为受类型限制. f.此时通过父类引用变量调用的方法是子类覆盖或继承的方法,不是父类的方法.
- 向下转型 a.父类型原为子类型,只是把类型还原,并不是本质上修改类型 b.目的是转换为子类型后,可以调用子类型特有的方法. c.需要强制类型转换 d.不安全,可能会出现类型转换异常 classcastException e.通常建议转换前使用instanceof判断一下
- instanof 运算符 a.用来判断一个对象是否属于一个类或者实现了一个接口 b.结果返回true 或者false