1. 程式人生 > >Java之多態

Java之多態

異常 同步 有變 fault 提高 eat 判斷 耦合度 同仁

一、多態

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;

讓所有變形金剛一起開火,開火前先自報家門。

Java之多態