一、多态

1、含义

一种类型,呈现多种状态。主要关注类多态、方法多态。

2、多态的前提:继承

使用父类引用指向子类对象:

Animal a1 = new Cat();

Object a1 = new Cat();

3、多态的三大定理

1)对象不变,new Cat();不会变为Dog对象;

2)编译时只能调用编译时类型已定义的方法,a1.eat();不能调用Animal未定义的方法,不能调用Animal未定义的方法;

3)运行时调用的是运行时类型覆盖后的方法 ;(调用的是什么?)      (非static)

4、对定理2的补充

无法调用子类特有的方法,采用强制类型转换,需要注意类型的判断,避免ClassCastException(类型转换异常。)

if(a1 instanceof Dog){

Dog d1 = (Dog)a1;

d1.watchHouse();

}

5、多态的分类

1)基本类型多态

2)类多态

3)方法多态

a、编译时多态:重载

编译时决定调用哪个方法

b、运行时多态:覆盖

运行时决定调用哪个方法

6、多态的应用

思路:面向父类编程 ->抽象 -> 通用;

适合做设计,形成通用的程序(框架技术)

(1)在方法的参数表中使用多态

public void feed(Animal a1,Animal a2)

参数可以传入任何Animal以及子类的对象;

public void foo(Object obj)

参数可以传入任何的对象,什么都“is-a”Object

(2)在方法的返回值类型使用多态

结合设计模式:工厂模式——降低代码的耦合度,解耦合;

public class AnimalFactory{

public static Animal getAnimal(int msg){

Animal a1 = null;

switch(msg){

case 1:  a1 = new Cat();  break;

case 2:  a1 = new Dog();  break;

case 3:  a1 = new Cat();  break;

default;

}

return a1;

}

}

使用时:

Animal a1 = AnimalFactory.getAnimal(1);

Animal a1 = AnimalFactory.getAnimal(3);

代码只和Animal和AnimalFactory有关,如果需要改变获得的产品,只需修改工厂类,降低diamante的耦合度,提高软件的可复用性、易维护性。

(3)一视同仁

Animal[] as = new Animal[5];

for(int i=0;i<as.length;i++){

as[i].eat("sd");

}

需求分析:得到《需求规格说明书》

是软件分析、设计、开发、测试、维护等重要依据

系统分析:问题空间--OOA

根据名词、动词将问题进行分类和归纳;

系统设计:解空间--OOD

软件建模,使用UML语言;(属于软件工程中内容)

UML统一建模语言,特点:使用各种图形表达设计;

(1)静态建模

1)用例图:use-case

2)类图(重点)class -dia

表示类的信息、以及类间的关系(比如继承)

(2)动态建模

1)时序图:系统功能不同步骤、按照时间顺序表示;

对象的生命周期:从创建-> 反复使用 -> 销毁

关注:使用UML工具类图,进行设计。

日常工具:纸和笔、意念;

专业工具:ration公司Rose,被IBM收购了;Sybase公司PowerDesigner,除了数据库设计,也能设计UML;

MyEclipse提供了UML插件(正版的)

需求:设计变形金刚类

BXJG类是所有变形金刚的父类,

属性:id、name、age;

构造方法:无参、有参;

业务方法;fire开火、public void fire()、show自报家门、public void show();、

具备三个子类:QingTZ、DaHF、WeiZT

作业;根据UML图,对bxjg类加以实现,并使用

创建不同子类对象

1擎天柱5000;

2大黄蜂3000

3威整天4500;

让所有变形金刚一起开火,开火前先自报家门。

最新文章

  1. Qt动画效果展示(文艺IT男)
  2. 山东省第七届ACM省赛------Triple Nim
  3. Express+mysql的博客(1)
  4. jquery中链式调用原理
  5. CSS布局技巧 -- 内凹圆角
  6. redis系列-主从复制
  7. Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现) .
  8. 由浅到深讲解C#-LINQ
  9. Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
  10. swift变量交换赋值
  11. java 类加载机制总结
  12. 每日冲刺报告——Day1(Java-Team)
  13. 我为什么要花大力气从头研发智表ZCELL(一个仿EXCEL的前端插件)
  14. java并发编程系列七:volatile和sinchronized底层实现原理
  15. Linux !的使用
  16. webstorm 2017 激活
  17. 微信小程序——获取元素的宽高等属性
  18. 织梦调用多个栏目typeid="1,2,3"不支持的解决方法
  19. ADB抓取日志和日志过滤
  20. Catalan数,括号序列和栈

热门文章

  1. 怎用不用工具创建一个javaWeb项目
  2. 在WebBrowser控件使用js调用C#方法
  3. Spring IOC(四)总结
  4. java加密解密
  5. LeetCode 26. Remove Duplicates from Sorted Array (从有序序列里移除重复项)
  6. 解决执行sql脚本报错:没有足够的内存继续执行程序。
  7. 深度揭秘ES6代理Proxy
  8. Java8 函数式编程详解
  9. Problem K
  10. Hadoop部署配置文件