java中的抽象類


package com.aaa.zxf.ajax.test;

/**

  一、java中的 抽象

 Animal這個類 存在的意義是什么?
    (動物園真的有一個動物叫Animal嗎?沒有 但是你為了某種操作創建了Animal 那么此時程序就有一個bug


 分析:
     1  Animal這個來存來僅僅是用來產生多態,但是為了多態而導致能創建Animal對象這顯然是不合理的,
            所以我們希望:Animal這個類得存在,但是不能通過new 創建對象
     2  Animal的eat有用,在編譯的時候 如果Animal沒有eat函數 編譯不會通過,但是我們運行的時候 是調用的真實類型的eat()所以Animal的eat不會被調用。
            Animal的eat方法得有 但是方法體沒什么用。
            所以我們希望:Animal中的eat函數 只聲明 不寫實現(因為沒必要寫)。
     3  Animal的子類必須要有各自的eat函數,但是我們做的練習 eat可以不寫,此時會去調用父類的eat函數。所以我們希望:子類必須實現eat()函數

    解決方案:將Animal這個類變成抽象類


 二、聲明一個抽象類

 三、java中抽象類中構造函數使用
      1.   構造函數是對象的基本,沒有構造函數就沒有對象。

      2.   父類抽象類中寫了有參數的構造函數,子類繼承是就必須寫一個構造函數來調用父類的構造函數

 四、匿名內部類

 */
public class JavaDuoTai {
    public static void main(String[] args) {
        // 繼承多態
        Animal02 h = new Hourse();
        // h 代表了兩個對象。
                h.sleep();      // 調用父類抽象類中的普通方法  sleep
                h.eat();        // 調用子類中的方法 eat。

        Hourse hourse = new Hourse("張三", 45);
        System.out.println("  name="+hourse.name +"     age="+ hourse.age);



        /**
         *  抽象類無法通過new 來創建對象。 因為是抽象的。
         *  我是匿名內部類 實現它的抽象方法。
         * 這種寫法
         */
        Animal02 animal02 = new Animal02() {
            @Override
            public void eat() {
                System.out.println("我是匿名內部類");
                //多一個T$1.class,這個class就是匿名內部類的原型,
                // 所以new針對的還是普通的class(雖然內部類和普通類有很大不一樣),只不過這個class的寫法稍有不同,它是編譯器幫我們從匿名內部類中提取的。
                System.out.println("獲得class的對象"+this.getClass());
            }
        };

        //執行 匿名內部類
        animal02.eat();

    }

}
class Animal01{
    public int id;
    public String name;
    private  int age;

    void run(){
        System.out.println("動物要吃飯");
    }
}

class  Dog01 extends  Animal01{
    public  String food;

    @Override
    void run(){
        System.out.println("狗吃骨頭");
    }

}

class Cat01 extends Animal01{
    public String color;

    @Override
    void run(){
        System.out.println("貓吃魚");
    }
}


/**
 * 二、 聲明一個抽象類
 *
 *   1.   關鍵字  abstract  用來修飾類 和 方法。
 *
 *
 *   2.   抽象類的特征?
             * A  抽象方法不需要寫方法體
             * B  抽象方法必須在抽象類中
             *      The type Animal must be an abstract class to define abstract methods
             * C  抽象類中不一定要有抽象方法 (抽象類可以有抽象方法 普通方法 成員方法)
             * D  子類繼承了一個抽象父類並且父類中有抽象方法 那么子類必須去重寫抽象方法----》抽象方法由子類負責實現
             * E  抽象類不能通過new創建對象 但是 有構造函數 (
             *    這個構造函數是用來讓子類調用的
 *
 */

// 定義一個抽象類。
abstract class Animal02{


    public  String name;
    public  int age;

    public Animal02() {
    }

    //有參數的構造函數      這個構造函數是用來讓子類調用的
    public Animal02(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public  abstract void eat(); //1.抽象方法不需要寫方法體    2.抽象方法必須在抽象類中

    //抽象類中不一定要有抽象方法     普通方法
    public  void  sleep(){
        System.out.println("睡覺!");
    }

}


//子類 繼承抽象類 需要重寫父類的方法
class Hourse extends  Animal02{

    public Hourse() {
    }

    // 讓子類調用父類的 構造函數  關鍵字 super
    public Hourse(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("馬飛飛。");
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM