隨著繼承層次中一個個新子類的定義,類變得越來越具體,而父類則更一般,更通用。類的設計應該保證父類和子類能夠共享特征。有時將一個父類設計的非常抽象,以至于它沒有具體的實例,這樣的類叫做抽象類。?
抽象方法的類必須被聲明為抽象類。
抽象類不能被實例化。抽象類使用來被繼承的,抽象類的子類必須重寫父類的抽象方法,并提供方法體。若沒有重寫全部的抽象方法,仍為抽象類。
不能用abstract 修飾屬性、私有方法、構造器、靜態方法、final的方法。?
abstract :抽象的,可以用來修飾類、方法。
1.abstract 修飾類:抽象類
1)不可以被實例化
2)抽象類有構造器(凡是類都有構造器)
3)抽象方法所在的類一定是抽象類。
4)抽象類中可以沒有抽象方法。
5 ) 抽象類中可以有非抽象方法。
abstract 修飾方法,抽象方法
1)格式:沒有方法體,如:public abstract void eat();
2 ) ?抽象方法只保留方法的功能,而具體執行,交給繼承抽象類的子類,由子類重寫抽象方法。
3)若子繼承抽象類,并重寫了所有的抽象方法,則此類是一個”實體“,即可以實例化。
抽象類應用:
抽象類是用來模型化那些父類無法確定全部實現,而是由其子類提供具體實現的對象的類。
解決方案:
java允許設計者指定:超類聲明一個方法但不提供實現,該方法的實現由子類提供。這樣的方法稱為抽象方法。有一個或更多抽象方法的類稱為抽象類。
模板方法設計模式
抽象類體現的就是一種模板模式的設計,抽象類作為多個子類的通用模板,子類子在抽象類的基礎上進行擴展、改造,但子類總體上會保留抽象類的行為方式。
解決問題:
當功能內部一部分實現是確定,一部分實現是不確定的。這時可以把不確定的部分暴露出去,讓子類去實現。
編寫一個抽象父類,父類提供了多個子類的通用方法,并把一個或多個方法留給其子類實現,就是一種模板模式。
public class TestTemplate {
public static void main(String[] args) {
Template template =new SubTemplate();
template.spendTime();
}
}
abstract classTemplate{
public abstract void code();
public void spendTime(){
long start = System.currentTimeMillis();
code();
long end? = System.currentTimeMillis();
System.out.println("花費時間"+(end-start));
}
}
class SubTemplateextendsTemplate{
public void code(){
boolean flag =false;
for(inti? =2;i<10000;i++){
for(intj =2;j
if(i%j ==0){
flag =true;
break;
}
}
if(!flag){
System.out.println(i);
}
flag =false;
}
}
}