《Java4Android》視頻學習筆記——為什麼用抽象類別?

來源:互聯網
上載者:User

標籤:

我們來舉個例子,然後引出這個問題的答案:

 

市面上有 噴墨式印表機 和 針式印表機 這兩種形式的印表機,我們需要編程來實現他們的 開機,關機以及列印。

構建父類Printer

class Printer
{
void open(){
System.out.println("OPEN");
}


void close(){
System.out.println("CLOSE");
}

void print(){                                                                //由於兩種印表機的列印方式不同,所以無法在父類裡面寫出具體列印方式,因此空著。
}
}

構建子類HPprinter

//該印表機為噴墨印表機
class HPprinter extends Printer
{
void print(){
System.out.println("噴墨列印");
}
}

構建子類Canonprinter

//該印表機為針式印表機
class Canonprinter extends Printer
{
void print(){
System.out.println("針式列印");
}
}

構建主函數 Test 實現功能

class Test
{
public static void main(String args[]){
Printer HP = new HPprinter();

HP.open();
HP.print();
HP.close();


Printer Canon = new Canonprinter();

Canon.open();
Canon.print();
Canon.close();


}
}

編譯運行發現沒有錯誤。

 

可是,電腦說沒有錯誤就真的沒有錯誤嗎?不見得。設想一下,如果,寫子類程式的人要是粗心,忘記了複寫父類的 void print(){}; 會發生什麼事情?

當然,編譯時間沒有錯誤的,可是,印表機卻沒有了最重要的功能,並且,這種情況電腦是不會告訴你,哪兒有問題的。雖然這是個可能性很低的例子,但是大家不要糾結於此,且看老夫引蛇出洞:

既然問題出現了,那就有解決方案,這時,我們靈光乍現,忽然想起了親愛的 抽象函數,它不就是幹這個的嗎?

重新定義父類 Printer

abstract class Printer
{
void open(){
System.out.println("OPEN");
}


void close(){
System.out.println("CLOSE");
}

abstract void print(){
}
}

現在當我們忘記複寫 print(){}; 的時候,系統是編譯不過去的,重新實現人機結合。同時,需要注意的一句話是:

如果一段代碼在語意上是錯誤的,那它在文法上也應該是有錯誤的,比如說我們之前的 print(){}; ,它居然是空著的,那它就是在語意上說不過去,所以文法上也是有錯誤的,只不過編譯器沒有識破它。最後我們還是用抽象函數這個文法解決了問題。

 

《Java4Android》視頻學習筆記——為什麼用抽象類別?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.