Java基础之面向对象详细讲解(5)——三大特性之多态

多态(十分重要)

多态就是同一个对象拥有多种形态

解释助理解

下面是我听的应该是最好理解的版本了,讲给你们

情况:现在一个人养了三个动物,分别是猫、狗、猪,人要喂养它们建立多个类来完成操作

按照之前学过的应该是这样一种情况:

cat.java

package animal;

public class cat {
    public void eat(){
        System.out.println("猫吃");
    }
}

dog.java

package animal;

public class dog {
    public void eat(){
        System.out.println("狗吃");
    }
}

pig.java

package animal;

public class pig {
    public void eat(){
        System.out.println("猪吃");
    }
}

person.java

package animal;

public class person {
    public void feed_cat(cat cat){
        System.out.println("喂猫");
        cat.eat();
    }
    public void feed_dog(dog dog){
        System.out.println("喂狗");
        dog.eat();
    }
    public void feed_pig(pig pig){
        System.out.println("喂猪");
        pig.eat();
    }
}

main.java

package animal;

public class main {
    public static void main(String[] args) {
        person p = new person();
        cat cat = new cat();
        dog dog = new dog();
        pig pig = new pig();
        p.feed_cat(cat);
        p.feed_dog(dog);
        p.feed_pig(pig);
    }
}

为什么使用多态

那么当我要再养一个fox,那么我需要再创建一个fox类,然后在person.java中创建一个feed_fox方法,然后再在主方法中实例化fox,然后调用person.java中的feed_fox方法

当我要再次增加时,就需要不停地重复这样的操作

这些操作中,创建fox类是必须的,那么有什么可以简化呢?

多态的理解

这些猫狗猪狐狸是不是都可以看成动物,那么人参与喂养的时候,只需要喂养动物不就可以了吗,我把猫、狗、猪、狐狸都看成动物;在之前我是要

cat cat = new cat(); 这里是把猫当做猫建立的对象

那么我把猫看成动物建立一个对象(前提是猫是动物,cat extends animal)

animal cat = new cat();

那么人喂养的时候,我丢进去一个动物,不管它是啥,我喂他就可以了

多态好处

当我建立一个动物的时候,我不需要再在人里建立一个针对该动物的喂养方法,我只需要把这个动物仅仅当做动物来喂养;

对于代码而言:

把不同的数据类型进行统一

这样写极大地增强了代码的可扩展性,相当于通过动物创建了一个人喂养具体动物的接口,当我再次添加动物时,不需要改动person代码,只需要将此动物继承animal即可

代码助理解

dog、cat、pig的行为都不变都是吃

构建一个animal类行为是eat

person的行为改变,不是喂养具体的动物,而是抽象的动物

cat.java

package animal;

public class cat extends animal{
    public void eat(){
        System.out.println("猫吃");
    }
}

cat.java

package animal;

public class dog extends animal{
    public void eat(){
        System.out.println("狗吃");
    }
}

pig.java

package animal;

public class pig extends animal{
    public void eat(){
        System.out.println("猪吃");
    }
}

animal.java

package animal;

public class animal {
    //动物吃
    public void eat(){

    }
}

person.java

package animal;

public class person {

    //人喂养动物
    public void feed(animal animal){
        System.out.println("喂养动物");
        //动物吃
        //在animal以及cat、dog、pig中都有eat()这个方法
        //因为我cat、dog、pig都继承了animal,
        //所以这里的eat()应该是具体到具体的动物的eat()
        animal.eat();
    }
}

main.java

package animal;

public class main {
    public static void main(String[] args) {
        person p = new person();
        //向上转型,猫、狗、猪一定是动物,所以就当作动物处理
        //向上转型无风险
        //只是具体的方法不能使用,比如猫可以玩毛线,但是动物不一定都玩,所以不存在
        animal cat = new cat();
        animal dog = new dog();
        animal pig = new pig();

        //当不是具体的动物要进行子类具体的方法时,要进行类型的转换
        ((cat)cat).play();

        p.feed(cat);//人喂养动物,这个具体的动物是猫
        p.feed(dog);//人喂养动物,这个具体的动物是狗
        p.feed(pig);//人喂养动物,这个具体的动物是猪

        //向下转型成一个猫,实例化一个animal对象,
        // 他一定是cat吗?不一定,所以要强制转化
        //向下转型有风险
        animal sth = new dog();
        cat cc = (cat)cat;
        p.feed(cc);
    }
}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值