二十一、多態

1、對象的多種形態
《1》引用多態
父類的引用指向本類的對象
父類的引用指向子類的對象
《2》方法多態
創建本類對象時,調用的方法是本類方法
創建子類對象時,調用的方法爲子類重寫的方法或者繼承的方法
2、父類:

public class Animal {
    public void eat(){
        System.out.println("動物吃");
    }
}

子類:

public class Dog extends Animal{

    /**
     * @param args
     */
    public void eat(){
        System.out.println("狗吃");
    }
    public void whatch(){
        System.out.println("看門");
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Animal obj1=new Animal();
        Animal obj2=new Dog();
       // Dog obj3=new Animal();//錯誤,不能是子類的引用指向父類的對象
        obj1.eat();
        obj2.eat();
       //obj2.whatch();//錯誤,不能把父類的引用指向子類沒有繼承重寫的方法
    }

}

輸出:動物吃
狗吃
3、多態中引用類型的轉換
《1》向上類型轉換(隱式/自動類型轉換),是小類型到大類型的轉換。
《2》向下類型轉換(強制類型轉換),是大類型到小類型
《3》instanceof運算符,來解決引用對象的類型,避免類型轉換的安全問題
Dog dog=new Dog();
Animal animal=dog;
if(animal instanceof Dog){
Dog dog2=(Dog)animal;
}else{
System.out.print(“無法進行”);
}
if(animal instanceof Cat){
Cat cat=(Cat)animal;//編譯是按cat類型那個編譯,運行時Dog類型
}else{
System.out.println(“無法進行類型轉換”);
}
輸出:無法進行類型轉換
4、抽象類
abstract

《1》某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確知道這些子類如何實現這些方法。也就是說抽象類是約束子類必須有哪些方法,而並不關注子類如何去實現。
《2》從多個具有相同特徵的類中抽象出一個抽象類,以這個抽象類作爲子類的模版,從而避免了子類設計的隨意性。
作用:
限制規定子類必須實現某些方法,但不關注實現細節。
使用規則:
abstract定義抽象類
abstract定義抽象方法,只有聲明。不需要實現。
包含抽象方法的類是抽象類。
抽象類中可以包含普通方法,也可以沒有抽象方法。
抽象類不能直接創建,可以定義引用變量

包含抽象方法的類一定是抽象類,抽象類和抽象方法都需要添加關鍵字 abstract,且順序爲 abstract class

public abstract class Telphone {
   public abstract void call();//抽象方法沒有方法體以分號結束
       public abstract void message();
}
``

public class Smartphone extends Telphone{

@Override
public void call() {
    // TODO Auto-generated method stub
    System.out.println("通過語音打電話");
}

@Override
public void message() {
    // TODO Auto-generated method stub
    System.out.println("通過語音打電話");
}

}

public class Cellphone extends Telphone{

@Override
public void call() {
    // TODO Auto-generated method stub
    System.out.println("通過鍵盤打電話");
}

@Override
public void message() {
    // TODO Auto-generated method stub
    System.out.println("通過鍵盤發短信");
}

}

public static void main(String[] args) {
// TODO Auto-generated method stub
Telphone tel1=new Cellphone();
tel1.call();
Telphone tel2=new Smartphone();
tel2.call();

}
5、接口
一種特殊的類,由全局常量和公共的抽象方法所組成。類是一種具體實現體,而接口定義了某一批所需要遵守的規範,接口不關心這些類的內部數據,也不關心這些類方法的實現細節,它只規定這些類裏必須提供某些方法。

**interface關鍵字**
[修飾符 ] interface 接口名【extends 父接口1,父接口2...】{
多個常量
多個抽象方法
}
常量:接口中的屬性是常量,即使定義時不添加public static final 修飾符,系統會自動添加。
方法:接口中的方法都是抽象方法,即使定義時不添加public abstract修飾符,系統自動添加。
使用接口:一個類可以實現一個或多個接口,實現接口使用**implements關鍵字**。Java中一個類只能繼承一個父類,不夠靈活,可以通過實現多個接口補充。

繼承父類實現接口的語法:
**[修飾符] class 類名 extends 父類 implements 接口1,接口2...
{
類體部分//如果繼承了抽象類,需要實現繼承的抽象方法;要實現接口中的抽象方法
}**
如果要繼承父類,繼承的父類必須在實現接口之前。

定義接口:

public interface IPlayGame {//省略到abstract關鍵字
public void playGame();
}

實現接口

public class Smartphone extends Telphone implements IPlayGame{

@Override
public void call() {
    // TODO Auto-generated method stub
    System.out.println("通過語音打電話");
}

@Override
public void message() {
    // TODO Auto-generated method stub
    System.out.println("通過語音打電話");
}

@Override
public void playGame() {
    // TODO Auto-generated method stub
    System.out.println("可以打遊戲");
}

}

public class Psp implements IPlayGame{

@Override
public void playGame() {
    // TODO Auto-generated method stub
    System.out.println("可以打遊戲");
}

}


Main()函數

public static void main(String[] args) {
// TODO Auto-generated method stub
Telphone tel1=new Cellphone();
tel1.call();
Telphone tel2=new Smartphone();
tel2.call();

    IPlayGame ip1=new Smartphone();//指向實現接口的類
    IPlayGame ip2=new Psp();
    ip1.playGame();
    ip2.playGame();
}

使用接口:接口在使用過程中,還經常與匿名內部類配合使用。
**匿名內部類**就是沒有名字的內部類,多用於關注實現而不關注實現類的名稱

語法格式:

IPlayGame ip3=new IPlayGame(){
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println(“使用匿名內部類的方式實現接口”);
}
};//注意以分號結束
ip3.playGame();


或者

new IPlayGame(){
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println(“使用匿名內部類的方式實現接口”);
}
}.playGame();
“`

6、UML
Unified Modeling Language統一建模語言
是一個支持模型化和軟件系統開發的圖形化語言
Visio, Rational Rose , PowerDesign

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章