首页 > 其他分享 >多态

多态

时间:2023-02-10 17:57:56浏览次数:58  
标签:子类 多态 转型 重载 父类 重写

多态

多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

对面向对象来说,多态分为编译时多态运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。

多态:父类的引用 指向 子类的实例,接口的引用 指向 实现类的实例

Java 实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。

  • = 继承:在多态中必须存在有继承关系的子类和父类。
  • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。

多态一般分为两种:重写式多态和重载式多态。

  • 重载式多态,也叫编译时多态。也就是说这种多态再编译时已经确定好了。重载大家都知道,方法名相同而参数列表不同的一组方法就是重载。在调用这种重载的方法时,通过传入不同的参数最后得到不同的结果。

    但是这里是有歧义的,有的人觉得不应该把重载也算作多态。因为很多人对多态的理解是:程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,这种情况叫做多态。 这个定义中描述的就是我们的第二种多态—重写式多态。并且,重载式多态并不是面向对象编程特有的,而多态却是面向对象三大特性之一(如果我说的不对,记得告诉我。。)。

    我觉得大家也没有必要在定义上去深究这些,我的理解是:同一个行为具有多个不同表现形式或形态的能力就是多态,所以我认为重载也是一种多态,如果你不同意这种观点,我也接受。

  • 重写式多态,也叫运行时多态。这种多态通过动态绑定(dynamic binding)技术来实现,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。 这种多态通过函数的重写以及向上转型来实现,我们上面代码中的例子就是一个完整的重写式多态。我们接下来讲的所有多态都是重写式多态,因为它才是面向对象编程中真正的多态。

  • 向上转型

    子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口

    向上转型的好处

    • 减少重复代码,使代码变得简洁。
    • 提高系统扩展性。

    向下转型

    与向上转型相对应的就是向下转型了。向下转型是把父类对象转为子类对象。(请注意!这里是有坑的。)

    向下转型注意事项

    • 向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)
    • 向下转型只能转型为本类对象(猫是不能变成狗的)。

标签:子类,多态,转型,重载,父类,重写
From: https://www.cnblogs.com/amor2818/p/17109066.html

相关文章

  • 12 多态讲解
    多态讲解代码packagecom.zhan.base05Oop.base05Oop03;publicclassTest12{//多态/*多态的注意事项:1.多态是方法的多态,属性没有多态2.......
  • 多态之虚方法
    使用virtual标记父类为虚方法,使用override重写子类usingSystem;namespace多态{classProgram{staticvoidMain(string[]args){......
  • 关于C++多态的学习
    父类virtualtypefuncname(arg);子类typefuncname(arg);typefuncnamearg完全一致就算子类重写了。覆盖了基类的func。还可以子类直接写个override example: typef......
  • 34-多态
    多态简介◆即同一方法可以根据发送对象的不同而采用多种不同的行为方式。◆一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多◆多态存在的条件​ 有继承......
  • 多态
    publicclassStudentextendsPerson{@Overridepublicvoidrun(){System.out.println("1");}publicvoideat(){System.out.println......
  • 什么时候会有多态?
    因为Java的引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,编译和声明有关。运行时类型由实际赋给该变量的对象决定,也就是......
  • 面向对象程序设计 第八章 多态性
    目录运行时的多态性(虚函数、纯虚函数、抽象类)  override与final  重载运算符(运算符重载为成员函数)  运算符重载为非成员函数 ......
  • 52面向对象-多态
    packagechapter04;publicclassJava13_Object{publicstaticvoidmain(String[]args){//TODO面向对象-多态//多态指一个对象在不同场景下......
  • Java多态
    Java中的多态是一个概念,通过它我们可以通过不同的方式执行单个动作(方法)。多态性派生自2个希腊词:“poly”和“morphs”。词语“poly”意为许多,“morphs”意为形式。所......
  • 虚函数与多态
    虚函数:C++中的虚函数的作用主要是实现了多态的机制。虚函数是一种在基类定义为virtual的函数,并在一个或多个派生类中再定义的函数。虚函数的特点是,只要定义一个基类的指针,就......