多态


一、什么是多态

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

二、何时使用到多态

例如教务管理系统:

  定义有Teacher,Student,administrator三个类

  在写注册方法的时候不应该每个类都写一遍,而是写一个通用的方法

  所以写这三个对象的父类Person即可

  多态还可以根据传递对象的不同,调用不同的子类方法(前提是方法在子类中重写)

以多态方式创建对象:Fu f = new Zi();

        Person s = new Student();
        s.setName("张三");
        s.setAge(18);

        Person t = new Teacher();
        t.setName("李四");
        t.setAge(32);

        Person a = new Administrator();
        a.setName("王五");
        a.setAge(54);

        register(s);
        register(t);
        register(a);

三、多态调用成员的特点

  1.变量调用:编译看左边,运行也看左边。

    在编译时会看父类中有没有这个变量,没有则报错,在运行时实际获取的就是左边父类中的成员变量的值

  2.方法调用:编译看左边,运行看右边。

    在编译时会看左边父类中有没有这个方法,运行的时候实际上调用子类的方法(重写方法)

  理解:

    成员变量:在子类的对象中,会把父类的成员变量也继承下来

    成员方法:如果子类对方法进行了重写,那么在虚方法中是会把父类的方法覆盖的

  优势:

    一、在多态形式下,右边对象可以实现解耦合,便于扩展和维护

    也就是只需要创建一个多态对象,后期可以直接修改这个对象的类,后面的代码不需要修改

    二、定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与遍历

  弊端:

    一、假如父类中没有这个方法,不能调用子类中的方法

      解决方案:将对象类型转换回类型:子类 变量名 = (子类) 多态名

    判断对象类型:instanceof 例如a instanceof Dog d返回值为boolean

    强制转换可以将对象转为子类类型,从而调用子类独有的功能,在转换前最好用instanceof判断