Java中多态、抽象类与接口的关系

发布于:2023-01-22 ⋅ 阅读:(386) ⋅ 点赞:(0)

不妄求,则心安,不妄做,则身安

多态:

生活中的多态:同一个事物,作用条件不一样,结果不一样

java中的多态:同一个父类引用,指向不同的子类实例,执行不同的操作,方法重写是实现多态的前提

多态实现步骤:

  1. 在抽象父类中定义抽象方法

  2. 子类继承抽象父类并重写父类中所有的抽象方法

  3. 测试类中创建父类引用指向不同的子类实例,父类引用调用方法,调用的是子类重写后的哪些方法

    • 向上转型(自动类型转换):父类的引用指向子类的实例

    • 向下转型(强制类型转换):子类的引用指向父类的实例

通过向上转型创建的父类引用,在调用方法的时候,如果指向的子类实例重写了其要调用的方法,那么调用的是子类重写后的方法,如果子类没有进行进行重写,那调用的就是父类里的方法。

父类的引用无法调用子类里独有的方法,必须使用向下转型成对应的子类,才能通过子类去调用子类中独有的方法在向下转型的时候,容易出现ClassCastException(类型转换异常),原因是将父类引用转换成了不匹配的子类对象,可以通过instanceof关键字类判断父类引用指向的是哪一个子类实例,从而避免类型转换异常。

/*
     * 抽象方法:使用abstract修饰的方法为抽象方法
     *  1)抽象方法没有方法体
     *  2)抽象方法所在的类需要声明为抽象类
     *  3)子类继承一个抽象类后,子类中必须重写抽象父类中所有的抽象方法,如果不重写,那么子类也需要定义为抽象类
     * 
     * 抽象类:使用abstract修饰的类为抽象类
     *  1)抽象类的声明跟之前声明一个类没有太大的区别,依然可以封装属性、声明构造方法、声明getXxx()/setXxx()方法、重写toString()方法等
     *  2)抽象类中可以包含抽象方法、也可以不包含抽象方法(但是抽象方法所在的类一定要声明为抽象类)
     *  3)抽象类不能实例化(不能通过new的方式来创建对象)
     */

接口

接口的概念:

1、接口是一种约定

2、接口的使用:

  • 接口中的成员变量,默认都是public static final的,必须显示初始化

  • 接口中的方法,默认都是public abstatic的

  • 接口没有构造方法,不能被实例化

  • 一个接口不能实现另一个接口,但可以继承多个其他接口

  • 一个类必须实现接口抽象方法(implements),除非这个类也是抽象类

3、抽象类与接口的异同

  • 相同点

    • 代表系统的抽象层

    • 都不能被实例化

    • 都能包含抽象方法

      • 用于描述系统提供的服务,不必提供具体实现

  • 不同点

    • 在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法

      • 抽象类便于复用,接口便于代码维护

    • 一个类只能继承一个直接的父类,但可以实现多个接口

4.使用原则

  • 接口做系统与外界交互的窗口

    • 接口提供服务

  • 接口本身一旦制定,就不允许随意修改

  • 抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点

5、总结

  • Java中的接口

    • 属性全都是全局静态常常量

    • 方法都是全局抽象方法

    • 无构造方法

  • 一个类可以实现多个接口,非抽象类实现接口时必须实现接口中的全部方法

  • 抽象类利于代码复用,接口利于代码维护