黑马程序员技术交流社区
标题: 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 |