Abstract詳解

今天來介紹一下抽象類。我們用動物類來看,上代碼:

public class Animal {

    String name;

    public Animal() {
        // TODO Auto-generated constructor stub
    }

    public void sleep() {
        System.out.println("閉上眼睛就睡覺");
    }

    public void shout() {
        System.out.println("");
    }

}
public class Cat extends Animal{

    @Override
    public void shout() {
        System.out.println("喵喵叫");
    }
}
public class Dog extends Animal{

    @Override
    public void shout() {
        // TODO Auto-generated method stub
        System.out.println("汪汪叫");
    }

}
public class Test {

    public static void main(String[] args) {
        Animal animal= new Animal();
        animal.name="動物";
        animal.shout();
        animal.sleep();
        System.out.println();

        Dog dog = new Dog();
        dog.name= "旺財";
        System.out.print("狗狗"+dog.name);
        dog.shout();
        dog.sleep();

        System.out.println();

        Cat cat = new Cat();
        cat.name="小花";
        System.out.print("貓咪"+cat.name);
        cat.shout();
        cat.sleep();
    }
}

運行結果:


閉上眼睛就睡覺

狗狗旺財汪汪叫
閉上眼睛就睡覺

貓咪小花喵喵叫
閉上眼睛就睡覺

從上面的類中我們可以發現animal類中的shout()方法在生活中幾乎是不可能用到的,於是我們爲了代碼的簡潔,shout()方法不需要方法體,但是會報錯誤This method requires a body instead of a semicolon。於是我們便引入了abstract關鍵字。當我們加上abstract之後,還是會報錯誤The abstract method shout in type Animal can only be defined by an abstract class。那麼怎麼辦呢?抽象方法需要在抽象類中定義。

public abstract class Animal {

    String name;

    public Animal() {
        // TODO Auto-generated constructor stub
    }

    public void sleep() {
        System.out.println("閉上眼睛就睡覺");
    }

    public abstract void shout() ;
}
/**
 * 動物類
 * shout(); 這個方法裏的方法體沒有用 但這個方法不能註釋 讓子類重寫
 * 1.abstract抽象的
 *   The abstract method shout in type Animal can only be defined by an abstract class
 * 2.如何定義一個抽象方法
 *   語法:
 *     【訪問權限符】 abstract 返回值 方法名();
 *   eg:
 *      public abstract void shout();
 * 3.如何定義一個抽象類
 *   語法:
 *    【訪問權限符】  abstract class 類名{}
 *   eg:
 *    public abstract class Animal {
 *    }
 * 4.總結
 *     A.抽象方法一定要在抽象類中
 *     B.抽象類中可以有   0 1 多個 抽象方法
 *     C.抽象類不能直接實例對象 只能創建子類對象 抽象類一定要被繼承
 *       Cannot instantiate the type Animal
 *     D.子類繼承父類 如果父類是抽象類 子類一定要實現父類裏所有的抽象方法 除非子類也是抽象類
 *     E.abstract可以修飾   類  方法
 *               不能修飾   成員變量 構造方法
 *     F.抽象類中的成員
 *               成員變量   成員方法  構造方法       
 *        
 */

總結一下知識點:
1. 語法

 A.抽象類和抽象方法必須使用 abstract修飾
 B.抽象類不能直接實例 只能被繼承
 C.抽象類必須有構造方法 創建子類對象時候需要
 D.抽象類可以有至少0個抽象方法
 E.抽象方法只有聲明沒有實現(名字  沒有方法體)
 F.public abstract void shout(){} 不是抽象方法
 G.子類必須重寫抽象方法,如果不重寫,自己也得是抽象類  

2.意義
A.抽象類爲所有子類提供了一個通用模板,子類可以在此模板上進行擴展
B.通過抽象類,可以避免子類設計隨意性
C.通過抽象類,可以嚴格限制子類的設計,使得子類更加通用

抽象類就是用來作父類的用來被繼承的

問題1:
Animal an=new Animal(); 沒有一種生物叫Animal 創建Animal沒有意義
拒絕實例
解決方法:
Animal類 定義爲抽象類
抽象類不能直接實例但可以被繼承

問題2:
dog可以重寫shout也可以不重寫 如果希望dog必須重寫shout方法 不重寫就有編譯錯誤

解決方法:
Animal類 裏的shout方法定義爲抽象方法
抽象方法只有聲明,沒有實現

發佈了27 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章