• JAVA多态


    一、多态概念

    所谓多态,是指一个引用(类型)在不同情况下的多种状态。

    父类的引用指向自己的子类对象,这就是多态的代码体现形式。

    多态通过“继承”和“接口”两种现象构成。

    二、多态的前提

    类与类之间必须有关联,要么“继承”,要么“实现”

    存在覆盖

    三、多态好处

    提高了程序的扩展性

    四、多态的弊端

     只能使用父类的引用访问父类的成员。

    如果所创建的子类象要访问子类自己所特有的属性或访问时,则需要类型强制转换。

    示例:

    以下示例中,子类Cat和Dot继承了父类Animal的方法,重写了父类的方法。

    在创建子类对象时,可以直接使用父类引用来引用它的子类对象。

    附值=左侧的引用变量一样,对象类型由右侧实例决定。

    这样,就可以用一个父类引用来创建N个子类实例,方便开发。

    package javastudy;
    
    public class Demo1 {
    
        public static void main(String[] args) {
    
            // TODO Auto-generated method stub
            /*
             * 以下非多态 Cat c=new Cat(); //创建子类Cat的对象 c.cry();
             * 
             * Dog d=new Dog(); //创建子类Dog的对象 d.cry();
             */
            // 以下为多态
            myFun(new Cat()); // 直接用父类的         如果不使用以下的myFun方法,可以写成Animal a=new Cat(); a.cry();类型提升,向上转型
            myFun(new Dog());
    
        }
    
        public static void myFun(Animal a){  //相当于Animal a=new Cat();
            a.cry();
        }
    
    }
    
    class Animal {
    
        public void cry() {
            System.out.println("不知道怎么叫");
        }
    }
    
    // 子类
    
    class Dog extends Animal {
        // 狗叫
        public void cry() { // 函数的重写
            System.out.println("汪汪叫");
        }
    }
    
    class Cat extends Animal {
        // 猫叫
        public void cry() {
            System.out.println("喵喵叫");
        }
    }

    输出:

    喵喵叫
    汪汪叫

    示例二

    package javastudy;
    
    public class Demo2 {
    
        public static void main(String[] args) {
            Master master=new Master();            //创建Master实例
            master.feed(new MyDog(), new Bone());    //
            master.feed(new MyCat(), new Fish());
        }
    }
    
    
    //主人类
    class Master
    {
        //给动物喂食,使用多态,方法就用一个
        public void feed(MyAnimal a,Food f) {        //如果再加动物和食物,feed方法名不用改,形参会自动调用
            a.eat();            //调用对应的子类的方法
            f.showName();        //调用对应的子类的方法
        }
    }
    
    //动物类
    class MyAnimal{
        
        //动物会叫
        public  void cry() {
            System.out.println("不知道怎么叫");
        }
        //动物会吃东西
        public void eat(){
            System.out.println("不知道喜欢吃什么");
        }
    }
    
    
    //动物子类——狗
    
    class MyDog extends MyAnimal{
        //狗叫
        public void cry(){
            System.out.println("汪汪叫");
        }
        //狗吃东西
        public void eat(){
            System.out.println("狗吃骨头");
        }
    }
    
    //动物子类——猫
    class MyCat extends MyAnimal{
        //猫叫
        public void cry(){
            System.out.println("喵喵叫");
        }
        //猫吃东西
        public void eat(){
            System.out.println("猫吃鱼");
        }
        
    }
    
    //食物类
    class Food
    {
        String name;
        public void showName(){
    
        }
    }
    //食物的子类——鱼
    class Fish extends Food{
        public void showName() {
            System.out.println("我是一条鱼");
        }
    }
    
    //食物的子类——骨头
    class Bone extends Food{
        public void showName() {
            System.out.println("我是一跟骨头");
        }
    }

    输出:

    狗吃骨头
    我是一跟骨头
    猫吃鱼
    我是一条鱼

  • 相关阅读:
    VS Code中编写C
    Latex
    JAVA学习-----容器和数据结构
    Markdown2最最基本操作说明(未完待续)
    [lua] table.sort(_table, comp)使用要点
    [coco2d]pageView:addPage时,page无法对齐
    [cocos2d]修改富文本文本和高度
    [cocos2d]格式化获取当前layer的控件名
    [c++]牛客刷题记录2.18
    [c++]STL学习
  • 原文地址:https://www.cnblogs.com/ibelieve618/p/6409084.html
Copyright © 2020-2023  润新知