今天來介紹一下抽象類。我們用動物類來看,上代碼:
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方法定義爲抽象方法
抽象方法只有聲明,沒有實現