黑马程序员 08 Java基础教学 - 08 - 面向对象(4) 之 多态
来源:互联网 发布:ubuntu路径设置 编辑:程序博客网 时间:2024/06/12 01:39
-------android培训、java培训、期待与您交流! ----------
本日志doc文档下载
一、多态
1、多态的体现
父类的引用指向了自己的子类对象
2、多态的前提
必须是类与类之间的关系。要么继承,要么实现
通常还有一个前提就是:覆盖
3、多态的好处
多态的出现大大的提高了程序的扩展性
4、多态的弊端
提高了扩展性的同时,只能使用父类的引用访问父类中的成员。
5、多态的应用
多态示例一:
abstract class Animal {abstract void eat();}class Activities {void doActivity(Animal a) {if (a != null) {a.eat();}if (a instanceof Cat) {((Cat) a).catchMouse();} else if (a instanceof Dog) {((Dog) a).kanJia();} else if (a instanceof Pig) {((Pig) a).sleep();}}}class Cat extends Animal {@Overridevoid eat() {System.out.println("吃鱼");}void catchMouse() {System.out.println("抓老鼠");}}class Dog extends Animal {@Overridevoid eat() {System.out.println("吃骨头");}void kanJia() {System.out.println("看家");}}class Pig extends Animal {@Overridevoid eat() {System.out.println("吃饲料");}void sleep() {System.out.println("老是睡觉");}}public class DuoTaiDemo1 {public static void main(String[] args) {// new Activities().doActivity(null);Animal a = new Cat();//类型提升,向上转型a.eat();//如果想要调用猫的特有方法,如何操作??//强制将父类的应用转成子类类型,向下转型Cat c = (Cat)a;c.catchMouse();/** * 注意:前往不能将父类对象转成子类类型 * Animal a = new Animal(); * Cat c = (Cat)a; * 我们能转换的是父类引用执行了自己子类对象是,该应用可以被提升 * 多态自始至终都是子类对象在做着变化 *///下面代码是利用Activities类创建对象完成对Cat,Dog,Pig进行的活动new Activities().doActivity(new Cat());new Activities().doActivity(new Dog());new Activities().doActivity(new Pig());}}多态示例二
/** * 需求:电脑运行实例,电脑运行基于主板,提供扩展功能 * * @author LeeYou * */interface PCI {public void open();public void close();}/** * 主板,使用PCI接口 * */class MainBoard {public void run() {System.out.println("mainBoard run...");}public void userPCI(PCI p) {if (p != null) {p.open();p.close();}}}/** * 网卡扩展类,实现PCI接口 * */class NetCard implements PCI {@Overridepublic void open() {System.out.println("netcard open...");}@Overridepublic void close() {System.out.println("netcard close...");}}/** * 声卡扩展类,实现PCI接口 * */class SoundCard implements PCI {@Overridepublic void open() {System.out.println("soundcard open...");}@Overridepublic void close() {System.out.println("soundcard close...");}}class DuoTaiDemo3 {public static void main(String[] args) {MainBoard mb = new MainBoard();mb.run();mb.userPCI(new SoundCard());mb.userPCI(new NetCard());}}6、多态的注意事项
6.1在多态中成员函数的特点
6.1.1 在编译时期:参阅引用型变量所属的类是否有调用的方法。如果有,编译通过;如果没有,编译失败。
6.1.2 在运行时期:参阅对象所属的类中是否有调用的方法。
6.2在多态中,成员变量的特点(常用于面试)
无论编译和运行,都参考左边(引用型变量所属的类)
6.3在多态中,静态成员函数的特点(常用于面试)
无论在编译和运行,都参考左边(引用型变量所属的类)
代码如下:
class Father {int num = 10;void method1() {System.out.println("Father method 1");}void method2() {System.out.println("Father method 2");}static void method4() {System.out.println("Father method 4");}}class Son extends Father {int num = 20;void method1(){System.out.println("Son method 1");}void method3(){System.out.println("Son method 3");}static void method4() {System.out.println("Son method 4");}}class DuoTaiDemo2 {public static void main(String[] args) {//演示6.1Father f = new Son();f.method1();f.method2();//对应6.1.2//f.method3(); 对应6.1.1//演示6.2System.out.println(f.num);//演示6.3f.method4();}}结果如下截图:
- 黑马程序员 08 Java基础教学 - 08 - 面向对象(4) 之 多态
- 黑马程序员 05 Java基础教学 - 05 - 面向对象(1) 之 类、对象、封装
- 黑马程序员 07 Java基础教学 - 07 - 面向对象(3) 之 继承、抽象、接口
- 黑马程序员---Java基础--08天(面向对象之三多态)
- 黑马程序员 06 Java基础教学 - 06 - 面向对象(2) 之 关于静态static的那些事
- 黑马程序员----JAVA基础之面向对象
- 黑马程序员----java基础之面向对象
- 黑马程序员----Java基础之面向对象
- 黑马程序员--JAVA基础之面向对象
- 黑马程序员-JAVA基础之面向对象
- 黑马程序员----java基础之面向对象
- 黑马程序员----java基础之面向对象
- 黑马程序员-JAVA基础之面向对象
- 黑马程序员 Java基础之面向对象
- 黑马程序员----Java基础之面向对象(封装 继承 多态)
- 黑马程序员-----java基础三(之面向对象)
- 黑马程序员--Java基础之面向对象(1)
- 黑马程序员--Java基础之面向对象(2)
- Android中定时器的3种实现方法
- java开发线程篇2:sleep() 和 wait() 有什么区别? (做线程的必知!)
- 输入年月日,算出那天是当年的第几天
- Python的类
- Android 中插件的编写方法
- 黑马程序员 08 Java基础教学 - 08 - 面向对象(4) 之 多态
- linux系统中各个文件描述——陆续添加
- caret包函数不完全解析
- 函数指针 Function Pointer
- 简单端口扫描linux port scanner
- Java有没有goto?
- 【Andorid X 项目笔记】开源项目使用(6)
- 第二部分 Linux Shell高级编程技巧——第三章 运行级别脚本介绍
- 【Linux学习笔记】栈与函数调用惯例—上篇