会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132604个问题
JAVA 全系列/第一阶段:JAVA 快速入门/控制语句、方法、递归算法 24902楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/异常机制 24903楼
JAVA 全系列/第一阶段:JAVA 快速入门/控制语句、方法、递归算法 24904楼
JAVA 全系列/第九阶段:权限控制与安全认证/Shiro(旧) 24905楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/反射技术(旧) 24906楼
JAVA 全系列/(隐藏)第三十阶段:设计模式/框架源码分析(拓展)/Mybatis 底层源码分析 24907楼

class Animal {
    public void shout() {
        System.out.println("叫了一声!");
    }
}
class Dog extends Animal {
    public void shout() {
        System.out.println("旺旺旺!");
    }
    public void seeDoor() {
        System.out.println("看门中....");
    }
}
class Cat extends Animal {
    public void shout() {
        System.out.println("喵喵喵喵!");
    }
}
public class TestPolym {
    public static void main(String[] args) {
        Animal a1 = new Cat(); // 向上可以自动转型
        //传的具体是哪一个类就调用哪一个类的方法。大大提高了程序的可扩展性。
        animalCry(a1);
        Animal a2 = new Dog();
        animalCry(a2);//a2为编译类型,Dog对象才是运行时类型。
         
        //编写程序时,如果想调用运行时类型的方法,只能进行强制类型转换。
        // 否则通不过编译器的检查。
        Dog dog = (Dog)a2;//向下需要强制类型转换
        dog.seeDoor();
    }
 
    // 有了多态,只需要让增加的这个类继承Animal类就可以了。
    static void animalCry(Animal a) {
        a.shout();
    }
 
    /* 如果没有多态,我们这里需要写很多重载的方法。
     * 每增加一种动物,就需要重载一种动物的喊叫方法。非常麻烦。
    static void animalCry(Dog d) {
        d.shout();
    }
    static void animalCry(Cat c) {
        c.shout();
    }*/
}

老师,这是学习材料里的代码,我可以理解它的意思但是我不理解为什么要引入多态,对于这个例子为什么不直接使用

        Dog d = new Dog();
        Cat c = new Cat();
        d.shout();
        c.shout();

这样的调用来实现,不需要重载动物的喊叫方法啊

JAVA 全系列/第一阶段:JAVA 快速入门/面向对象详解和JVM底层内存分析 24908楼
JAVA 全系列/第十三阶段:分布式文件存储与数据缓存/Nginx 24910楼
Python 全系列/第三阶段:Python 网络与并发编程/并发编程 24911楼
JAVA 全系列/第十三阶段:分布式文件存储与数据缓存/Nginx 24913楼
Python 全系列/第十五阶段:Python 爬虫开发/爬虫基础(旧) 24914楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637