抽象類的學習總結
下面通過一下的小程序深入理解抽象類
因此在類Animal裡面只需要定義這個enjoy()方法就可以了,使用abstract關鍵字把enjoy()方法定義成一個抽象方法,定義如下:public abstract void enjoy();
從某種意義上來說,抽象方法就是被用來重寫的,所以在父類聲明的抽象方法一定要在子類裡面重寫。如果真的不想在子類裡面重寫這個方法,那麼可以再在子類裡面把這個方法再定義為抽象方法,因為子類覺得我去實現也不合適,應該讓繼承我的子類去實現比較合適,因此也可以在繼承這個子類的下一個子類裡面重寫在父類裡面聲明的抽象方法,這是可以的。
這裡有一個規則:既然父類裡面的方法是抽象的,那麼對於整個類來說,它就有一個沒有實現的方法,這個方法不知道怎麼去實現,那麼這個類是就是殘缺不全的,因此這個類應該被定義為一個抽象類。所以前面這樣聲明的聲明的class Animal應該要在class的前面加上abstract,即聲明成這樣:abstract class Animal,這樣Animal類就成了一個抽象類了。Animal類的最終定義代碼如下:
/**
* 父類Animal
* 在class的前面加上abstract,即聲明成這樣:abstract class Animal
* 這樣Animal類就成了一個抽象類了
*/
abstract class Animal {
public String name;
public Animal(String name) {
this.name = name;
}
/**
* 抽象方法
* 這裡只有方法的定義,沒有方法的實現。
*/
public abstract void enjoy();
}
Java語言規定,當一個類裡面有抽象方法的時候,這個類必須被聲明為抽象類。
子類繼承父類時,如果這個父類裡面有抽象方法,並且子類覺得可以去實現父類的所有抽象方法,那麼子類必須去實現父類的所有抽象方法,如:
/**
* 子類Dog繼承抽象類Animal,並且實現了抽象方法enjoy
* @author gacl
*
*/
class Dog extends Animal {
/**
* Dog類添加自己特有的屬性
*/
public String furColor;
public Dog(String n, String c) {
super(n);//調用父類Animal的構造方法
this.furColor = c;
}
@Override
public void enjoy() {
System.out.println("狗叫....");
}
}
==============================
這個父類裡面的抽象方法,子類如果覺得實現不了,那麼把就子類也聲明成一個抽象類,如:
/**
* 這裡的子類Cat從抽象類Animal繼承下來,自然也繼承了Animal類裡面聲明的抽象方法enjoy(),
* 但子類Cat覺得自己去實現這個enjoy()方法也不合適,因此它把它自己也聲明成一個抽象的類,
* 那麼,誰去實現這個抽象的enjoy方法,誰繼承了子類,那誰就去實現這個抽象方法enjoy()。
* @author gacl
*
*/
abstract class Cat extends Animal {
/**
* Cat添加自己獨有的屬性
*/
public String eyeColor;
public Cat(String n, String c) {
super(n);//調用父類Animal的構造方法
this.eyeColor = c;
}
}
==============================
這裡的子類Cat從抽象類Animal繼承下來,自然也繼承了Animal類裡面聲明的抽象方法enjoy(),但子類Cat覺得自己去實現這個enjoy()方法也不合適,因此它把它自己也聲明成一個抽象的類,那麼,誰去實現這個抽象的enjoy方法,誰繼承了子類,那誰就去實現這個抽象方法enjoy()。如:
/**
* 子類BlueCat繼承抽象類Cat,並且實現了從父類Cat繼承下來的抽象方法enjoy
* @author gacl
*
*/
class BlueCat extends Cat {
public BlueCat(String n, String c) {
super(n, c);
}
/**
* 實現了抽象方法enjoy
*/
@Override
public void enjoy() {
System.out.println("藍貓叫...");
}
}
==============================
完整的測試代碼如下:
package javastudy.summary;
/**
* 父類Animal
* 在class的前面加上abstract,即聲明成這樣:abstract class Animal
* 這樣Animal類就成了一個抽象類了
*/
abstract class Animal {
public String name;
public Animal(String name) {
this.name = name;
}
/**
* 抽象方法
* 這裡只有方法的定義,沒有方法的實現。
*/
public abstract void enjoy();
}
==============================
/**
* 這裡的子類Cat從抽象類Animal繼承下來,自然也繼承了Animal類裡面聲明的抽象方法enjoy(),
* 但子類Cat覺得自己去實現這個enjoy()方法也不合適,因此它把它自己也聲明成一個抽象的類,
* 那麼,誰去實現這個抽象的enjoy方法,誰繼承了子類,那誰就去實現這個抽象方法enjoy()。
* @author gacl
*
*/
abstract class Cat extends Animal {
/**
* Cat添加自己獨有的屬性
*/
public String eyeColor;
public Cat(String n, String c) {
super(n);//調用父類Animal的構造方法
this.eyeColor = c;
}
}
==============================
/**
* 子類BlueCat繼承抽象類Cat,並且實現了從父類Cat繼承下來的抽象方法enjoy
* @author gacl
*
*/
class BlueCat extends Cat {
public BlueCat(String n, String c) {
super(n, c);
}
/**
* 實現了抽象方法enjoy
*/
@Override
public void enjoy() {
System.out.println("藍貓叫...");
}
}
==============================
/**
* 子類Dog繼承抽象類Animal,並且實現了抽象方法enjoy
* @author gacl
*
*/
class Dog extends Animal {
/**
* Dog類添加自己特有的屬性
*/
public String furColor;
public Dog(String n, String c) {
super(n);//調用父類Animal的構造方法
this.furColor = c;
}
@Override
public void enjoy() {
System.out.println("狗叫....");
}
}
==============================
public class TestAbstract {
/**
* @param args
*/
public static void main(String[] args) {
/**
* 把Cat類聲明成一個抽象類以後,就不能再對Cat類進行實例化了,
* 因為抽象類是殘缺不全的,缺胳膊少腿的,因此抽象類不能被實例化。
*/
//Cat c = new Cat("Catname","blue");
Dog d = new Dog("dogname","black");
d.enjoy();//調用自己實現了的enjoy方法
BlueCat c = new BlueCat("BlueCatname","blue");
c.enjoy();//調用自己實現了的enjoy方法
}
}
閱讀更多 黑馬程序員成都中心 的文章