多态以及实现

1.多态概述

多态:在继承层次结构中,父类中定义的行为被子类重写后表现出不同的效果,它使得同一个行为在父类及其子类中具有不同的语义,可以简单理解为:事物存在的多种形态。

比如说:动物(父类)有move()方法,至于怎么移动,就要看动物的子类了,猫可以跑,鸟可以飞,鱼可以游,他们都继承自动物这个类,并且重写了父类的move()方法。

前提

  1. 有继承关系
  2. 有方法重写
  3. 有父类引用指向子类对象
    Father f = new Son();
    注:如果把子类对象赋给父类引用(将子类对象当作父类对象看待),那么就只能调用父类中已有的方法。

好处

  • 提高了代码的维护性(继承保证)和扩展性(由多态保证)
  • 消除了类之间的耦合性(类之间的耦合是由于继承引起的)
  • 可以当作形式参数,接受任意子类对象。

弊端

  • 不能使用子类特有的属性和行为。

静态绑定和动态绑定
调用对象方法的执行过程:

  • 编译器获取所有可能被调用的候选方法
  • 编译器根据实参类型从候选方法中匹配出应该调用的方法
  • 静态绑定:编译器可以准确的知道,应该调用哪个方法。
  • 动态绑定。

多态中成员访问特点

  • 成员变量:编译时看左边(父类),运行时也看左边(父类)。
  • 成员方法:编译时看父类,运行时看子类(实际进栈方法是子类方法)。
  • 静态方法:编译时看父类,运行时看父类(静态和类相关,算不上重写)。

补充: 当作参数时用多态最好,因为可扩展性强。java依赖抽象类或者接口来实现多态。

关键字: instanceof,判断前边引用是否是后边的数据类型。

2.抽象类

为什么要有抽象类:
子类重写了父类的move()方法,实际上这个方法在父类中是无意义的。所以可以在父类中只声明,而不作任何实现(就是没有方法体),留给子类按照自己的方式去实现。

开闭原则(open-closed principle,OCP):
满足开闭原则的软件实体应该具有的两个主要特征:对于扩展是开放的,对于修改是关闭的,意思就是:一个软件实体,应该通过扩展来实现变化,而不是通过修改代码来实现。

开闭原则实现方法:

  • 里氏代换原则(LSP)
  • 依赖倒转原则(DIP )
  • 接口隔离原则(LSP)

抽象类特点:

  • 抽象类和抽象方法用abstract修饰
  • 抽象类不一定有抽象方法,但有抽象方法的一定是抽象类,或者是接口。
  • 抽象类按照多态的方式,由具体的子类实例化。
  • 抽象类的子类:要么是抽象类,要么就要强制重写抽象类中的所有抽象方法。

抽象类的成员特点:

  • 成员变量:既可以是变量,也可以是常量,abstract不能修饰成员变量。
  • 构造方法:有,用于子类访问父类数据的初始化。
  • 成员方法:既可以是抽象的,也可以是非抽象的。

抽象类的成员方法特性:

  • 抽象方法:强制要求子类做事情。
  • 非抽象方法:子类继承,提高复用性。

注: abstract不能与static,fina,private共存。
总结: 当无法定义一个类的时候,就定义为抽象类,来解决父类方法的不解定性,抽象方法不能在类中实现,所以没有函数体,抽象类可以被继承,并且要将抽象类中的抽象方法全部实现。

3.接口(Interface)一种特殊的抽象类

概述: 接口是抽象方法和常量值的集合,主要从需求的角度描述类具有哪些功能,而并不给出每个功能的具体实现,即:定义了一个行为规范。

特点:

  • 用interface表示: interface 接口名{};
  • 类实现接口用implements表示。
  • 接口不能实例化,可以定义接口类型的引用变量,用于指向实现了该接口的类的实例(实现多态)。
  • 接口的子类:可以是抽象类,但意义不大,可以使具体类,但是要重写接口中的的所有方法。

接口的成员特点:

  • 接口中定义的变量都是常量(相当于final),因为默认给变量加上了public static final。
  • 接口中无构造方法。
  • 接口中不能定义非抽象方法。

注: 接口中所有的都是公共的,建议手动给出public

补充:

  1. 类与类:继承关系,可以单继承,也可以多层继承。
  2. 类与接口:实现关系,可以单实现,也可以多实现,并且还可以在继承一个类时,实现多个接口。
  3. 接口与接口:继承关系,可以单继承,也可以多继承。
发布了18 篇原创文章 · 获赞 32 · 访问量 5127

猜你喜欢

转载自blog.csdn.net/weixin_44861399/article/details/104156123