黑马程序员技术交流社区

标题: Java面向对象之多态 [打印本页]

作者: 小詹    时间: 2018-4-5 19:36
标题: Java面向对象之多态
本帖最后由 小詹 于 2018-4-5 19:38 编辑

Java多态
• 多态概述
– 某一个事物,在不同时刻表现出来的不同状态。
• 举例
猫可以是猫的类型。猫 m = new 猫();
– 同时猫也是动物的一种,也可以把猫称为动物
动物 d = new 猫();
• 水在不同时刻的状态
• 多态的前提和体现
– 有继承关系
– 有方法重写
– 有父类引用指向子类对象


多态中成员的访问特点:
·成员变量访问特点
编译看左边,运行看左边
·成员方法访问特点
编译看左边,运行在右边
为什么成员变量和成员方法的访问不一样呢?
因为成员方法有重写,而变量没有。


多态的好处和弊端:
· 多态的好处
- 提高了程序的扩展性
- 具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作。
· 多态的弊端
- 不能访问子类特有功能
- 那么如何访问子类的特有功能呢?
• 通过多态中的转型


多态中的转型问题:
· 向上转型
- 从子到父
- 父类引用指向子类对象
· 向下转型
- 从父到子
- 父类引用转为子类对象
案例:
package com.itheima_04;
/*
*        向上转型
*                从子到父
*                父类引用指向子类对象
*        向下转型
*                从父到子
*                父类引用转为子类对象
*/
public class DuoTaiDemo {
        public static void main(String[] args) {
                //多态
                Animal a = new Cat(); //向上转型
                a.eat();

                //a.playGame();
                //多态的弊端:无法访问子类特有方法
                //现在我就想使用子类特有方法,怎么办呢?
                //创建子类对象就可以了
                /*
                Cat c = new Cat();
                c.eat();
                c.playGame();
                */
                //现在的代码虽然可以访问子类的特有功能,但是不合理
                //因为我们发现内存中有两个猫类的对象
                //这个时候,我们得想办法把多态中的猫对象还原
                //这个时候,就要使用多态中的转型了
                //父类引用转为子类对象
                Cat c = (Cat)a;
                c.eat();
                c.playGame();
        }
}
package com.itheima_04;

public class Cat extends Animal {
        public void eat() {
                System.out.println("猫吃鱼");
        }

        public void playGame() {
                System.out.println("猫捉迷藏");
        }
}
package com.itheima_04;

public class Animal {
        public void eat() {
                System.out.println("吃东西");
        }
}


作者: 小浙姐姐    时间: 2018-4-10 17:48





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2