致敬码农翻身-----面向对象(JAVA)三大特性之------多态

学习多态的总结

一:范例

//父类,动物园区员工总规章
public class Animal {
    int age;
    public void getFavoriteFood(){
        System.out.println("不知道");
    }
}
//Dog类园区员工,生成独有技能卡
public class Dog extends Animal{
    public void getFavoriteFood(){
        System.out.println("您最喜欢的食物是骨头");
    }
}
//Cat类园区员工,生成独有技能卡
public class Cat extends Animal{
    public void getFavoriteFood(){
        System.out.println("您最喜欢的食物是鱼");
    }
}
//Animal员工餐厅,只要是园区内的员工都能进入。
public class Restaurant {
    public void enterGate(Animal a){
    //说明:在JAVA中子类对象总是可以当做父类对象来使用,所以只要是动物,无论是什么品种都可以传进去
    //对象a激活方法技能卡,根据对象a的具体指向,调用相应的类的方法。
        a.getFavoriteFood();
    }
}
//测试类,生成对象和激活卡片
public class Test{
    public static void main(String[] args){
        //A1未变身前的尝试操作(三行)
        Animal A1 = new Dog();
        A1.age = 3;//A1激活属性卡
        A1.getFavoriteFood();//A1激活技能卡输出我最喜欢吃骨头

        //A2未变身前的尝试操作(三行)
        Animal A2 = new Cat();
        A2.age = 1;//A2激活属性卡
        A2.getFavoriteFood();//A2激活技能卡输出我最喜欢吃鱼

        //完整的流程
        Animal A1 = new Dog();
        Animal A2 = new Cat();
        Restaurant restaurant = new Restaurant();
        if (A1 instanceof Dog) {//判断
            Dog dog = (Dog)A1;//变身
            restaurant.enterGate(dog);//进餐厅吃饭,激活技能卡,输出我最喜欢吃骨头
        }
        if (A2 instanceof Cat) {
            Cat cat = (Cat)A2;
            restaurant.enterGate(cat);//进入餐厅吃饭,并激活技能卡,输出我最喜欢吃鱼
        }
    }
}

二:故事
大肉球A1和小肉球A2在一所名叫Animal的动物园里面相遇了,A1问A2为什么咱们两个长得那么像,我们到底是啥东西?A2也是一脸懵逼。
A1和A2只知道自己是动物园的员工,他们只好去动物园的门口的员工须知牌中寻找相关的信息。从那个告示牌中A1和A2知道了,原来自己有“年龄”这个属性和“获取最喜欢的食物”这个技能。可是他们再往下看却发现,大牌子上的获取最喜欢的食物上竟然
是“不知道”三个大字,A1和A2大为苦恼。还好,在告示牌最下边有一行小小的字:“所有成员注意了,在你们被孵化出来的时候相关的技能卡和属性卡已经发放到你们自己的口袋里面了,请在需要时自行调取使用。!”
这时候A1,A2才匆忙的翻出自己口袋,A1先是拿出一张属性卡age,激活后上边显示3,A1恍然大悟:自己竟然三岁了……卧槽,自己该不会是传说中的哪吒吧!再看看我的技能卡,技能卡getFavoriteFood(),激活技能卡之后上边显示您最喜欢的食物是骨头!
此时A2也进行着相同的动作,发现自己已经一岁了,而且自己最喜欢的食物是鱼·。
A1,A2似乎都明白过来了,自己可能分别是狗和猫,他们都想试着变身(强制类型转换)。但是在变身之前他们首先要判断一下自己的物种,(A1 instanceof Dog)哇哦,绿色变身指示灯亮了,在一阵激光束闪耀下(Dog dog = (Dog)A1 )A1变成了大暖男—-金毛!
A2也做了相同的动作(A2 instanceof Cat),指示灯也变成了绿色,A2也在一阵颤抖中(Cat cat = (Cat) A2 )变成了猫界大肉球——-橘猫(话说十只橘猫九只胖)!
A1A2相视哈哈大笑,终于知道自己长得啥样了。
没过一会A1,A2的肚子相继发出了咕噜咕噜的巨响,哈哈,金毛和橘猫都饿了,A1说咱们去吃饭吧! A1,A2在路上走着走着,突然他们发现了一个餐厅,他们兴奋的钻了进去,没过一会被保安赶了出来,保安大怒道:“没看见门口的牌子上边写着此餐厅只准老虎进吗!老虎不发威你当我是病猫吗!”。
金毛和橘猫胆颤心惊的走在这条美食街上,在路上他们不断地看到有各种各样的动物被从各式各样的餐厅中扔出来。艾玛,这年头吃个饭风险真大,有钱都花不出去。。。
后来在他俩将要绝望的时候发现了一个大大的餐厅,这个餐厅上边写着“Animal员工餐厅”
在门口蹲守了将近十分钟看到许许多的各式各样的动物进去了,然后心满意足的出来了,金毛和橘猫鼓起了勇气进入了Animal员工餐厅,在一阵激光束的照射下,这俩又变成了两团大肉球,而且自己身份的那段记忆已经消除了,他们分别的来到吧台,服务员指示他们激活自身技能卡getFavoriteFood()展示出各自喜欢吃的食物,随后他们也获得了各自钟情的食物。大肉球问:“为什么路上有一些员工有专门的餐厅啊,我们却必须在公共餐厅吃”。吧台服务员白了大肉球一眼,说:“园区就那么大,美食街总不能占太大的地吧,园区已经停止美食街的扩建了,当然了好处就是增加了园区的可维护性”。。。。。

三:核心定义概念及代码解释
Java中的多态:多态就是根据对象的不同对同一消息所做出的不同的反应
解释:1:这里的同一消息就是调用同一个函数;2:这里的不同反应就是子类重写的父类的方法。
所以总结出,要想实现多态就必须满足以下三个条件:
1:存在继承行为;2:子类要重写父类的方法(否则调用的方法就是继承过来的方法了);3:必须要有向上类型转换(父类引用指向子类对象)
解释代码:

Animal A1 = new Dog();
        A1.getFavoriteFood();

Java中有一个现象,子类对象总是可以被看做是父类对象
所以产生一个Dog类的对象,并将这个对象赋值给父类Animal的一个变量A1是完全可行的,并且称这种行为为向上类型转换。而且这两个类也存在继承关系,这样的话父类能做的子类也能做,我们当然可以用父类的变量来让子类的对象做父类可以做的任何事。所以多态性的另一个解释就是:把一个子类的对象看作是他的父类的对象,然后调用父类中定义的方法,但是实际上调用的是子类中定义的方法

注意:!!!此时我们已经得知A1就是Dog类的对象,而且父类中也存在getFavoriteFood()方法,所以A1调用方法getFavoriteFood()顺理成章的执行,如果这一个方法是子类独有的,也就是说这个方法不是重写父类的,那么在多态中是无法在满足向上类型转换的前提下编译成功的,所以前提必须是调用的这个方法是父类中也有的,有没有重写都可以编译成功(继承过来了,就算没重写也有方法可执行)。如果想执行子类独有的方法,那就必须要先进行向下类型转换,即强制类型转换。完完整整的转换成子类的对象,再去执行子类独有的方法。

解释代码:

public class Restaurant {
    public void enterGate(Animal a){
        a.getFavoriteFood();
    }
}
//执行测试类部分代码块
Animal A1 = new Dog();
        Animal A2 = new Cat();
        Restaurant restaurant = new Restaurant();
        if (A1 instanceof Dog) {//判断
            Dog dog = (Dog)A1;//变身
            restaurant.enterGate(dog);//进餐厅吃饭,激活技能卡,输出我最喜欢吃骨头
        }
        if (A2 instanceof Cat) {
            Cat cat = (Cat)A2;
            restaurant.enterGate(cat);//进入餐厅吃饭,并激活技能卡,输出我最喜欢吃鱼
        }

餐厅类生成一个对象restaurant之后这个对象执行enterGate(Animal a)方法,此时A1和A2都已经分别被强制转换为了具体类Dog和Cat的对象dog和cat,此时他们身为Animal的子类可以作为参数被传输进方法中(原因前边说了)。但是被再次当成父类对象传输进去之后他就又变化成了Animal类型的数据(相当于又变回了A1和A2)。在方法中执行操作a.getFavoriteFood();对象a在方法调用需要去判断这个a到底是什么对象,也就是实现了多态:根据对象的不同对同一消息所做出的不同的反应。

完结:致敬 码农翻身,致敬大神刘欣。这个世界我来了,我看到了他的缤纷多彩,令人着迷。

猜你喜欢

转载自blog.csdn.net/sun_DongLiang/article/details/80685783
今日推荐