抽象一直以來都是人們所神往的藝術形式,這點從梵高,畢加索等藝術家的身上就可以看出。抽象所代表的是一種形式上的美感,頗有一種虛無縹緲只可意會不可言傳的意味。但是JAVA中的抽象類與抽象方法相對而言就更加直接了,它給我的感覺更像是文章的副標題,本身不發揮什么作用,但是卻可以從中展開許多功能。
用關鍵字abstract修飾的類稱為abstract類(抽象類),比如:
abstract classA{
}
用關鍵字abstract修飾的方法稱為abstract方法(抽象方法),例如:
abstract int min (int x,int y);
對於abstract方法只允許聲明,不允許實現(因為沒有方法體)(畢竟叫抽象,當然不能實實在在的讓你實現),並且不允許使用final和abstract同時修飾一個方法或者類,也不允許使用static修飾abstract方法。也就是說,abstract方法只能是實例方法,不能是類方法。
既然abstract類和方法這么特殊,我們就必須對比一下它和普通類與方法之間的區別了:
1.abstract類中可以有abstract方法
abstract類中可以有abstract方法,也可以有非abstract方法
非abstract類中不可以有abstract方法
2.abstract類不能使用new運算符創建對象
但是如果一個非抽象類是抽象類的子類,這時候我們想要創建該對象呢,這時候它就必須要重寫父類的抽象方法,並且給出方法體,這也就是說明了為什么不允許使用final和abstract同時修飾一個類或者方法的原因。
重點常考!:final和abstract,private和abstract,static和abstract,這些是不能放在一起的修飾符,因為abstract修飾的方法是必須在其子類中實現(覆蓋),才能以多態方式調用,以上修飾符在修飾方法時期子類都覆蓋不了這個方法,final是不可以覆蓋,private是不能夠繼承到子類,所以也就不能覆蓋,static是可以覆蓋的,但是在調用時會調用編譯時類型的方法,因為調用的是父類的方法,而父類的方法又是抽象的方法,又不能夠調用,所以上的修飾符不能放在一起。
3.abstract類的子類
如果一個非abstract類是abstract類的子類,它必須重寫父類的abstract方法,也就是去掉abstract方法的abstract修飾,並給出方法體。
如果一個abstract類是abstract類的子類,它可以重寫父類的abstract方法,也可以繼承父類的abstract方法。
下面舉個例子:
abstract class GirlFriend{ //抽象類,封裝了兩個行為標准
abstract void speak();
abstract void cooking();
}
class ChinaGirlFriend extends GirlFriend{
void speak(){
System.out.println("你好");
}
void cooking(){
System.out.println("水煮魚");
}
}
class AmercanGirlFriend extends GirlFriend{
void speak(){
System.out.println("hello");
}
void cooking(){
System.out.println("roast beef");
}
}
class boy{
GirlFriend friend;
void setGirlFriend(GirlFriend f){
friend=f;
}
void showGirlFriend(){
friend.speaking();
friend.cooking();
}
}
public class text{
public static void main(String args[]){
GirlFriend girl =new ChineseGirlFriend(); //這里girl是上轉型對象
Boy boy=new boy();
boy.setGirlFriend(girl);
boy.showGirlFriend();
girl=new AmericanGirlFriend(); //girl 是上轉型對象
boy.setGirlFriend(girl);
boy.showGirlFriend();
}
}
————————————————
版權聲明:本文為CSDN博主「踏一回月」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_40302611/article/details/80426381