Java之多态

时间:2023-03-09 03:29:11
Java之多态

一、多态

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;

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