JavaSE_多态

多态

多态性主要表现在两个方面:

  • 重载:一个类中定义多个名字相同而实现不同的成员方法
    • 要求与父类的方法名必须相同
    • 方法的参数列表一定不一样
    • 访问修饰符和返回值类型可以相同但也可以不同,但仅修饰符和返回值类型不同不构成重载
  • 重写:对继承父类的某个成员方法进行重新实现
    • 方法名与返回值类型必须与父类相同
    • 参数列表必须相同
    • 访问权限不能比父类中被重写的方法的访问权限低
    • 子类若跟父类在同一个包中,父类中除了private和final的方法均可被重写
    • 构造方法不能被重写,每个方法均有属于自己的构造方法

多态中成员访问特点

  • 成员变量:编译看左边,执行看左边
  • 成员方法:编译看左边,执行看右边
    • 为什么成员方法和成员变量的访问不一样 因为成员方法有重写,而成员变量没有

多态的利弊

好处

  • 提高了程序的扩展性
    • 定义方法的时候,使用父类型作为参数,在将来使用时,使用具体的 子类型参与操作

弊端

  • 不能使用子类所特有的功能
    • 上转型对象不能访问其子类对象新增加的成员变量和方法,只能访问被子类继承并重写的变量或方法

抽象类

抽象类特点

  • 抽象类和抽象和方法必须使用abstract关键字修饰

  • 抽象类中不一定有抽象方法,有抽象方法的一定是抽象类

  • 抽象类原则上必须被继承,抽象方法必须被重写

  • 抽象类的子类

    • 要么重写抽象类中的所有抽象方法、
    • 要么该子类也是抽象类
  • 抽象类不能实例化

    • 若一定要实例化抽象类,可参照多态的方式,通过子类对象实例化,这叫抽象类多态

抽象类的成员特点

  • 抽象类中有成员变量

    • 可以是变量,也可以是常量
  • 抽象类中有构造方法

    • 虽有构造方法,但不能实例化。其存在的作用是用于子类访问父类数据的初始化
  • 抽象类中有成员方法

    • 可以有抽象方法:限定子类必须完成某些动作;也可以有非抽象方法:提高代码复用性

接口

接口的特点

  • 接口用关键字interface来修饰,用implement来实现接口
  • 在JDK8以后,可以有默认实现方法,须使用default关键字来修饰,亦可有静态方法
  • Java中只支持单继承父类,但允许一个类同时实现多个接口,同时也可以继承多个接口,且一个接口可以被多个不同的类来实现
  • 接口中声明属性默认为public static final,都是常量
  • 接口中定义的方法默认为public abstract,都是抽象方法
  • 若一个非抽象类实现某接口,则该类必须重写该接口中的所有方法,而且要显式地在这些被重写的方法前加public进行修饰
  • 接口的实现类
    • 要么重写接口中的所有抽象方法
    • 要么是抽象类
  • 接口不能实例化 若一定要实例化接口,可参照多态的方式,通过实现类对象实例化,这叫接口多态。
    • 多态的类型:具体类多态、抽象类多态、接口多态

接口的成员特点

  • 成员变量

    • 只能是常量, 默认修饰符:public static final
  • 成员方法

    • 只能是抽象方法, 默认修饰符:public abstract
  • 构造方法

    • 接口没有构造方法,接口主要对行为进行抽象,没有具体存在
    • 一个类如果没有父类,默认继承Object类

抽象类和接口的区别

  • 成员区别

    • 抽象类:有变量、常量、构造方法;有抽象方法、非抽象方法
    • 接口:只有常量;只有抽象方法
  • 关系区别

    • 类和类的关系:继承关系,只能单继承,但是可以多层继承

    • 类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

    • 接口和接口的关系:继承关系,可以单继承,也可以多继承

  • 设计理念区别

    • 抽象类:主要对类进行抽象,包括属性、行为
    • 接口:主要对行为进行抽象

抽象类名作为形参和返回值

  • 方法的形参是抽象类名,其实需要的是该抽象类的子类对象
  • 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象

接口名作为形参和返回值

  • 方法的形参是接口名,其实需要的是该接口的实现类对象
  • 方法的返回值是接口名,其实返回的是该接口的实现类对象