java 抽象類接口多態(tài)

/*
抽象類:

什么是時候使用抽象類:
    描述一類事物的時候,發(fā)現該事物確實存在著某種 行為,但是 目前這種 
    是不具體的,這時候應該抽取這種行為的聲明,而不去實現該種行為,這時候
    這種行為我們把它稱為抽象的行為,這時候應該使用抽象類。

抽象類要注意的細節(jié):
    1. 如果一個方法沒有方法體,那么該方法必須使用abstract修飾。
    2. 如果一個類含有抽象方法,那么這個類肯定是一個抽象類或者接口。
    3. 抽象類不能創(chuàng)建對象。
    4. 抽象類是含有構造方法的。
    5. 抽象類可以存在非抽象方法與抽象方法。
    6. 抽象類可以不存在抽象方法。
    7. 非抽象類繼承抽象類的時候,必須要把抽象類中所有抽象方法全部實現。

abstract不能與以下關鍵字一起使用
    1.abstract 不能與static共同修飾一個方法。
    2. abstract 不能與private共同修飾一個方法。
    3. abstract不能以final關鍵字共同修飾一個方法。


接口:

接口的定義格式:
    
    interface 接口名{
        成員變量

        成員函數..
    }

接口的作用:
    1. 程序解耦。
    2. 定義約束規(guī)范
    3. 拓展功能。

接口要注意的細節(jié):
    1. 接口中成員變量都是常量,默認 的修飾符是 public static fianl.
    2. 接口中的方法全部都是抽象的方法,默認的修飾符: public abstract。
    3. 接口不能創(chuàng)建對象。
    4. 接口是沒有構造函數的。
    5. 非抽象類通過implements實現接口的時候,必須要把接口中所有方法全部實現。 


接口與類之間 的關系: 實現關系。

注意: 一個類可以實現多個接口。

接口與接口之間的關系: 繼續(xù)關系。

注意: 一個接口是可以繼承多個接口的。


多態(tài):父類的引用類型變量指向了子類的對象,或者是接口的引用類型變量指向了接口實現類的對象。


多態(tài)要注意細節(jié):
    1. 多態(tài)情況下,如果子父類存在同名的成員變量時,訪問的是父類的成員變量.
    2. 多態(tài)情況下,如果子父類存在同名的非靜態(tài)函數時,訪問的是子類 的成員函數。
    3. 多態(tài)情況下,如果子父類存在同名的靜態(tài)函數時,訪問的是父類的成員函數。
    4. 多態(tài)情況下, 不能訪問子類特有的成員。

多態(tài)的應用: 
    1.多態(tài)用于形參類型的時候,可以接收更多類型的數據
    2. 多態(tài)用于返回值類型的時候,可以返回更多類型的數據.

*/
/*
目前多態(tài)情況下不能訪問子類特有的成員。

如果需要訪問子類特有的成員,那么需要進行類型強制轉換.


基本數據類型的轉換
    
    小數據類型-------->大的數據類型      自動類型轉換 (向上轉型)

    大數據類型--------->小數據類型       強制類型轉換  (向下轉型)  


引用數據類型的轉換
    
    小數據類型--------->大數據類型     自動類型轉換。

    大數據類型--------->小數據類型      強制類型轉換

類型轉換最場景的問題: java.lang.ClassCastException。 強制類型轉換失敗。


*/
//動物類
abstract class Animal{

    String name;

    public Animal(String name){
        this.name = name;
    }

    public abstract void run();
}

//老鼠
class  Mouse extends Animal{


    public Mouse(String name){
        super(name);
    }
    
    public  void run(){
        System.out.println(name+"四條腿慢慢的走!");
    }

    //老鼠特有方法---打洞
    public void dig(){
        System.out.println("老鼠在打洞..");
    }
}



//魚
class Fish extends Animal{

    public Fish(String name){
        super(name);
    }

    public  void run(){
        System.out.println(name+"搖搖尾巴游啊游 !");
    }


    //吹泡泡
    public void bubble(){
        System.out.println(name+"吹泡泡...!");
    }

}




class Demo2 
{
    public static void main(String[] args) 
    {
        /*
        Animal a = new Mouse("老鼠");  //多態(tài)
        //調用子類特有的方法
        Mouse m  = (Mouse)a;  //強制類型轉換
        m.dig();
        */

        Mouse m = new Mouse("米老鼠");
        Fish f = new Fish("草魚");

        print(f);

    }


    //需求: 定義一個函數可以接收任意類型的動物對象,在函數內部要調用到動物特有的方法。
    public static void print(Animal a){ // Animal a   = new Mouse("米老鼠");
        if(a instanceof Fish){
            Fish f = (Fish)a;
            f.bubble();
        }else if(a instanceof Mouse){
            Mouse m = (Mouse)a;
            m.dig();
        }
    }


}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容