多态的概念,特点和优缺点

    技术2022-07-10  157

    多态

    多态的概述和实现多态成员的特点多态中的向上转型和向下转型多态的优点和缺点

    多态的概述和实现

    概念:多态是同一个行为具有不同表现形式或形态的能力,多态性是对象多种表现形式和体现。多态的前提: 子父类的继承关系或子类实现父类接口必须有方法的重写父类引用指向子类对象 package com.itheima; /** * @author 11137_yyss3t3 * 多态的前提: * 子父类的继承关系 * 方法的重写 * 父类引用指向子类对象 */ public class Demo1_1 { public static void main(String[] args) { Cat cat = new Cat(); cat.eat(); //父类引用指向子类对象 Animal a = new Cat(); a.eat(); } } /** * @author 11137_yyss3t3 *父类,动物类 */ class Animal{ public void eat() { System.out.println("吃东西"); } } /** * @author 11137_yyss3t3 *子类猫继承了动物类并且重写了eat()方法 */ class Cat extends Animal{ @Override public void eat() { System.out.println("猫吃鱼"); } } 输出的结果为: 猫吃鱼 猫吃鱼

    多态成员的特点

    成员变量的特点:上代码 package com.itheima; /** * @author 11137_yyss3t3 * 多态的成员特点: * 成员变量:编译看左边,运行看左边 * 成员方法 * 静态方法 * */ public class Demo1_2 { public static void main(String[] args) { Dad dad = new Kid(); System.out.println(dad.num); } } class Dad{ int num = 20; } class Kid extends Dad{ int num = 10; } 输出结果为:20

    父类引用指向子类对象,父亲类和儿子类中都有成员变量,变量不像方法一样有重写,变量是没有重写的概念的,所以运行的是父类方法的成员变量。如果父类中没有这个成员变量,程序会出现编译错误。 多态中成员变量的特点是:编译看左边,运行也看左边

    成员方法的特点 package com.itheima; /** * @author 11137_yyss3t3 * 多态的成员特点: * 成员变量 * 成员方法:编译看左边,运行看右边 * 静态方法 * */ public class Demo1_2 { public static void main(String[] args) { //父类引用指向子类对象 Dad dad = new Kid(); dad.method(); } } class Dad{ public void method() { System.out.println("我是父类方法"); } } class Kid extends Dad{ public void method() { System.out.println("我是子类方法"); } } 输出的结果为:我是子类方法

    因为成员方法是可以重写的,所以会执行子类的方法。但是如果父类中没有method()方法,编译器会报错。 总结:编译看左边,运行看右边

    静态方法的特点 package com.itheima; /** * @author 11137_yyss3t3 * 多态的成员特点: * 成员变量 * 成员方法 * 静态方法:编译看左边,运行看左边 * */ public class Demo1_2 { public static void main(String[] args) { //父类引用指向子类对象 Dad dad = new Kid(); dad.method(); } } class Dad{ public static void method() { System.out.println("我是父类静态方法"); } } class Kid extends Dad{ public static void method() { System.out.println("我是子类静态方法"); } } 输出结果是:我是父类静态方法

    分析:使用变量去调用静态方法,其实相当于变量类型的类名去调用,也就是Dad.method(),所以运行的是父类里面的静态方法。如果父类没有静态方法,编译报错。 总结:编译看左边,运行看左边

    多态中的向上转型和向下转型

    向上转型 package com.itheima; /** * @author 11137_yyss3t3 * 多态的向上转型和向下转型 */ public class Demo1_3 { public static void main(String[] args) { //父类引用指向子类对象,其实这就是向上转型 Animal01 a = new Dog(); a.eat(); } } class Animal01 { public void eat() { System.out.println("吃东西"); } } class Dog extends Animal01{ @Override public void eat() { System.out.println("狗吃骨头"); } public void swim() { System.out.println("狗刨"); } } 输出结果是:狗吃骨头

    看上面代码狗类还有一个自己特有的方法游泳,现在是找不到子类的swim()方法的。如何才能运行swim()方法呢?

    向下转型 package com.itheima; /** * @author 11137_yyss3t3 * 多态的向上转型和向下转型 */ public class Demo1_3 { public static void main(String[] args) { //父类引用指向子类对象,其实这就是向上转型 Animal01 a = new Dog(); Dog d = (Dog)a;//向下转型 d.swim(); } } class Animal01 { public void eat() { System.out.println("吃东西"); } } class Dog extends Animal01{ @Override public void eat() { System.out.println("狗吃骨头"); } public void swim() { System.out.println("狗刨"); } } 输出结果:狗刨

    多态的优点和缺点

    缺点:父类引用无法直接访问子类特有成员优点: 可以提高可维护性提高可扩展性
    Processed: 0.012, SQL: 9