会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132428个问题
JAVA 全系列/第一阶段:JAVA 快速入门/JAVA入门和背景知识 1352楼
JAVA 全系列/第一阶段:JAVA 快速入门/面向对象详解和JVM底层内存分析 1359楼
JAVA 全系列/第一阶段:JAVA 快速入门/控制语句、方法、递归算法 1360楼
JAVA 全系列/第一阶段:JAVA 快速入门/面向对象详解和JVM底层内存分析 1362楼
JAVA 全系列/第一阶段:JAVA 快速入门/IDEA的使用和第一个java项目 1363楼

老师,多态的三个必要条件:继承,重写,父类引用执行子类对象。既然可以直接使用子类新建的对象调用重写的 方法,为何需要使用父类引用指向子类对象调用重写方法呢?而且父类引用指向子类对象还存在无法调用子类独有方法的缺陷。

// 测试多态和对象类型转换
public class TestPoly {

    static void animalCry(Animal a){
        a.shout();
    }

    public static void main(String[] args) {

        // 同一类中,static 方法可以调用其他 static 方法
        animalCry(new Cat());   // 以 Cat 对象调用 animalCry 方法

        Animal a1 = new Dog();
        /*注意,向上转型时,子类单独定义的方法会丢失,因此 a1 无法访问到 Dog 中的 seeDoor 方法。对于 Cat 类同理。*/
        a1.shout();
        animalCry(a1);   // a1 是编译时类型,Dog 才是运行时类型。

        

        Animal a01 = new Animal();
        a01.shout();

        Dog d01 = new Dog();
        d01.shout();
        d01.seeDoor();

        Cat c01= new Cat();
        c01.shout();
        c01.catchMouse();

    }
}


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 void catchMouse() {
        System.out.println("猫抓耗子");
    }

}


JAVA 全系列/第一阶段:JAVA 快速入门/面向对象详解和JVM底层内存分析 1364楼
JAVA 全系列/第一阶段:JAVA 快速入门/IDEA的使用和第一个java项目 1365楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

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