进阶二多态

多态概念

什么是多态

  • 多态是在 继承/实现 情况下的一种现象,表现为:对象多态、行为多态

具体的代码体现

  • 同种引用可以指向不同的对象(父类指向子类)
  • 不同的对象的同名函数实现的功能不同(重写方法)

多态的具体代码体现

多态的前提

  • 继承/实现 关系;存在父类引用子类对象;存在方法重写。

注意事项

  • 多态是对象、行为的多态。Java中的属性(成员变量)不谈多态。

使用多态的好处

  • 在多态形式下,右边对象是解耦合的,更利于拓展和维护。
  • 定义方法时,使用父亲类型的形参,可以接收一切子对象,拓展性更强,更便利。

多态的一个问题

  • 多态下不能使用子类独有的功能

类型转化

  • 自动类型转换:父类 变量名 = new 子类 ();
  • 强制类型转换:子类 变量名 = (子类)父类变量名

强制类型转换问题

  • (变量名name) instanceof (类名class)
    • 合法格式:父类变量名 instanceof 子类名
    • 步骤一:若name与class无父子关系,拒绝编译。
    • 步骤二:否则进入编译,判断name指向的实际对象是否属于class或class的子类,是则返回true,否则返回false。

final

认识final

  • final关键字是最终的意思,可以修饰 类、方法、变量
  • 修饰类:最终类,特点是无法被继承(断子绝孙)。
  • 修饰方法:最终方法,特点是不能被重写。
  • 修饰变量:该变量只能被赋值一次。

final修饰变量的注意

  • final修饰基本类型的变量,变量存储的数据不能被改变
  • final修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以改变的。

常量

  • 使用了static final修饰的成员变量称之为常量。
  • 作用:用于记录系统的配置信息
  • 命名规范:全大写字母、多个单词之间用下划线连接

使用常量记录系统配置信息的优势、执行原理

  • 增强代码的可读性、可维护性。
  • 程序编译后,常会被“宏替换”:出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接使用字面量的行能是一样的。

抽象类

认识抽象类

  • abstract修饰的;抽象方法只有签名,不能写方法体。
  • 注意事项
    • 包含抽象方法的类必须是抽象类。
    • 一个类若继承抽象类,必须重写完父类的所有抽象方法,否则该类也必须是抽象类。
    • 最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。

使用抽象类的好处

  • 父类知道每个子类都要做某个行为,但各个子类的具体实现不一样,就将父类定义成抽象方法,子类重写实现,是多态的思想。

抽象类的常见应用场景:模板方法设计模式

  • 解决方法中存在重复代码问题。

接口

认识接口

  • Java提供了一个关键字interface,用这个关键字我们可以定义出一个特殊的结构:接口。

接口类

  • 注意:接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类称为实现类。

实现类

  • 一个类可以实现多个接口(接口可以理解成干爹),实现类实现多个接口(多继承),必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。

接口的好处(重要)

  • 弥补了类单继承的不足,一个类同时可以实现多个接口。
  • 让程序可以面向接口编程,这样程序员就可以灵活方便得切换各种业务实现。
    • 例如我想要在不同场景下用不同的实现,就分别用两个实现类重写不同功能即可。
  • 通过implements接口,可以显性地知道该实现类的功能,从而方便使用。

JDK8开始接口的拓展

  • 新增三种形式的方法。
    • 默认方法:使用default修饰,使用实现类的对象调用。
    • 静态方法: static修饰,必须用当前接口名调用。
    • 私有方法:private修饰,jdk9开始才有的,只能在接口内部被调用。

接口中也可以有方法体

  • 新增方法的好处:增强了接口的能力,更便于项目的扩展和维护。

接口的其他细节

  1. 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承。
  2. 一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现。
  3. 一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。
  4. 一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。