Java:抽象方法和抽象类,抽象类应用模板方法模式,接口及使用
一、抽象類概念和作用
? ? ? ?
抽象類
? ? ? ? ? ? ? ? Java中可以定義沒有方法體的方法,該方法由子類來具體實現。
? ? ? ? ? ? ? ? 該沒有方法體的方法我們稱之為抽象方法,含有抽象方法的類我們稱之為抽象類
?抽象方法的特點
? ? ? ? ? ? ? ? a、只有方法頭沒有方法體的方法稱為抽象方法
? ? ? ? ? ? ? ? b、抽象方法用abstract來修飾
? ? ? ? ? ? ? ? c、抽象方法代表一種不確定的操作或方法
? ? ? ? ? ? ? ? d、抽象方法不能被調用? ? ? ? ? ?
? ??? Java中可以定義沒有方法體的方法,該方法有子類來具體實現:
? ? ? ? 我們以前定義的方法里面都會有相應的實現,至少寫個System.out來實現,但是Java中可以定義沒有方法體的方法,該方法由繼承它的子類來具體實現
? 該沒有方法體的方法我們稱之為抽象方法,含有抽象方法的類我們稱之為抽象類:
????????只有訪問的權限,返回值,函數名,以及參數,大括號里面的東西沒掉了,甚至都沒有大括號,我們把他稱為抽象方法
? ? ? ?抽象類對比我們普通的類,他有一個抽象方法,抽象方法是沒有方法體的方法
新建一個工程
我們做一個類? ? ? ? ? ?Demo1? ? ? ??
Demo1 里面有一個方法叫做抽象方法
所謂的抽象方法不就是public void printInfo();? ? ?只有類似于C語言里面的聲明,并沒有它的實現體
是不是很像c語言里面對頭函數的聲明呀
? ? ? ? 只是這樣寫的話他會? ?This method requires a body instead of a semicolon
這個方法需要定義一個方法體
?如果你不定義一個方法體的話,如何解決這個錯誤呢?
添加一個abstract
第3行? 添加以后又說了什么呢?
The abstract method printInfo in type Demo1 can only be defined by an abstract class
? ? ? ? 抽象方法只能放在抽象類里面
?所以在類前面也需要加上一個abstract的說明
?抽象方法代表一種不確定的操作或方法
printInfo沒有方法體,代表它的實現我們不知道
抽象方法不能被調用? ? ? ? ?
除了抽象方法不能被調用,抽象類也不能實例化
抽象類的特點
? ? ? ? 定義中含有抽象方法的類叫做抽象類
? ? ? ? 抽象類用abstract來修飾
? ? ? ? 抽象類代表一種抽象的對象類型
? ? ? ? 抽象類不能實例化
? ? ? ? 抽象類中可以有具體方法,可以沒有抽象方法
? ? ? ?
????????????????//A是一個抽象類
? ? ? ? ? ? ? ????????public? abstract class A{
? ? ? ? ? ? ? ? ? ? ? ????????public? void methodA(){
???????????????????????????}
? ? ? ? ? ? ? ? ? ? ? ? ????????public abstract void method? ?B();
? ? ? ? ? ? ? ? ????????}
包含有抽象方法的類一定是抽象類,但是抽象類不一定有抽象方法,你可以做一個類,里面帶abstract 的屬性,但是里面沒有抽象方法,但是這個就沒什么意義了
? ? ? ? 抽象類不能實例化
你new 它的時候讓你實現它的方法體????????????????public void printInfo() {
?? ??? ??? ??????????????????????????????????????????????????????????? ?// TODO Auto-generated method stub
?? ??? ??? ??? ?
?? ??? ??????????????????????????????????????????????????????????????????? ?}
?如果我把實現去掉,加個分號
Cannot instantiate the type Demo1
不能實例化這個Demo1
那抽象類不能被實例化,那么抽象類如何使用呢?
第一種方法:實例化的時候,同時要把函數做好
?我們可以加上一個System.out.println("demo1 print");
但是我們運行完發現什么都沒有
實例化抽象類的時候呢? ? ?第12行
對里面的抽象方法的函數體進行補充? ? ? ? 第14行到第16行
?補充完你可以d.printInfo();調用? ? ? ? 第20行
?運行結果
也就是說抽象類是不能被實例化的,你看到的這種方法感覺是實例化,其實是不是的
(匿名的內部類)
?這是一種不怎么靠譜的方式,那抽象類不能實例化,我們如何使用它呢?
一般我們做一個類來繼承抽象類
The type Demo2 must implement the inherited abstract method Demo1.printInfo()
這個Demo2 必須去實現Demo里面的printInfo這個接口
然后我們點擊這個提示
?雙擊這個提示
繼承過來的時候,把里面的東西實現了
?抽象類是不能被實例化的,我們唯一的用法就是繼承他并且實現里面的抽象方法
我的Demo1不能被實例化,我的Demo 2可以實例化
運行結果
?模板方法模式
? ? ? ? ·定義
? ? ? ????????? 一個模板方法用一些抽象的操作定義一個算法,而子類將重定義這些操作方法以提供具體行為
? ? ? ? ·意圖
? ? ? ????????? 定義了一個操作中的一個算法框架,把一些步驟推遲到子類去實現
? ? ? ? ? ? ? ? 模板方式讓子類不需要改變算法結構
// 模板方法
? ? ? ? public void work(){
? ? ? ? //1、授課前準備
? ? ? ? prepared();
? ? ? ? //2、進行授課
? ? ? ? teaching();
? ? ? ? //3、授課結束
? ? ? ? end();
}
新建一個工程
比如我們做智能家居
智能家居有個控制的類class Con
控制的類里面有個函數public void work()
那我們控制的步驟,????????初始化串口initUart();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?獲取一個指令getcomand();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 打開窗簾opencurse();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 打開燈openlight();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 打開電視openTV();
在con里面的work可以調用這么多的方法
????????
?這么多的方法,我統一給他做成抽象方法
?帶有抽象方法的類,一定是個抽象類
?現在這個控制函數我還不能用它,怎么辦呢?
比如說我現在用c51來完成這個控制,我這個代碼既能運行在c51上面,也能運行在STC15w上面
那么我有一個類,c51Con繼承于這個控制Con
當我繼承它的時候,肯定需要實現它里面所有的抽象方法
?按一下這個,就可以自動填充
?變成這樣
?我的控制在這里就是一個抽象的類
至于怎么控制,里面的控制的方法,我們沒有實現它,但是work他是一系列的流程
你要控制肯定初始化串口initUart();,
? ? ? ? ? ? ? ? ? ? ? ? 然后獲取指令getcomad();
????????????????????????然后去做一些基本的操作opencurse();
?? ??? ?????????????????????????????????????????????????????????openlight();
?? ??????????????????????????????????????????????????????????? ?openTV();
?這就是c51控制的
?
那么C51可以控制,那我的STC15w也能控制
我現在有個模板方法,有一系列的控制流程,可以用C51控制,也可以用STC15w控制
可以用C51實現智能家居,也可以用STC15w實現智能家居?
現在可以確認我有兩套方案控制家里的智能家居
?
?
那我現在用C51來做,我直接調用C里面的work();就完事了
因為這個work怎么控制,里面的代碼是沒有實現的
那我C51把他繼承過來的時候,把里面的每一個硬件相關的操作都?給他弄個出來了,當然我們這邊只是通過打印來調試
我把work的整體算法也給繼承過來了
?
?
?運行結果
Con沒有發現
?我們直接寫Con在這面命名上是有問題的
把他改成Con1就可以啦
?
?運行結果
?當然STC15w也能用
我的控制類在這里,控制類里面有工作流程(當然初始化串口這個函數每個硬件實現是不一樣的)
我只是做個模板放在這邊,這就叫模板方法模式
C51去繼承他,STC15w繼承他,去實現里面的抽象方法
也就是說我這套代碼即支持運行在C51上面,也支持運行在STC15w上面,也可以通用
?要用C51的話,需要實例化C51,C51Con c = new C51Con();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 然后調用C51里面的work();代碼
(這只是個類比 ,其實我們Java在單片機上是跑不了的)
????????????????????????????????
?加上STC15的
?運行結果
二、Java接口及使用
接口語法
? ? ? ? interface接口名{
? ? ? ? ? ? ? ? //公有靜態常量、抽象方法
}
接口的特點
? ? ? ? 接口中只能存放靜態常量和抽象方法
? ? ? ? Java接口是對功能的拓展
? ? ? ? 通過實現接口,Java類可以實現多實現
? ? ? ? 一個類可以同時繼承(extends)一個父類并且實現(implements)多個接口
? ? ? ? 接口與接口之間可以使用extends實現繼承
接口中只能存放靜態常量和抽象方法:
因為接口也是不能夠被實例化的,其實接口也不能被繼承,所以這面放普通變量的話,是要放常量
在接口里面放常量其實用的不太多,其實接口里面一般我們都放一些抽象的方法
接口與抽象類的區別
? ? ? ? 抽象類和具體實現之間是一個繼承關系,也就是如果采用抽象類的方式,則父類和子類在概念上應該是相同的is -a
? ? ? ? 接口的實現類在概念上不要求相同,接口只是抽取相互之間沒有關系的類的共同特征,而不去關注類之間的關系,它可以使沒有層次關系的類具有相同的行為
? ? ? ? 抽象類是對一組具有相同屬性和行為的邏輯上有關系的事物的一種抽象,而接口則是對一組具有相同屬性和行為的邏輯上不相關的事物的一種抽象
接口的實現類在概念上不要求相同,接口只是抽取相互之間沒有關系的類的共同特征,而不去關注類之間的關系,它可以使沒有層次關系的類具有相同的行為:
比如說人可以分為男人和女人,狗可以分為公狗和母狗,男人和公狗不好提取特征
但是人和狗還有共同特征,都會吃喝拉撒
那接口就有點不強調親屬的繼承關系,只強調行為
抽象類是對一組具有相同屬性和行為的邏輯上有關系的事物的一種抽象,而接口則是對一組具有相同屬性和行為的邏輯上不相關的事物的一種抽象
人跟狗就是邏輯上不相關事物的一種抽象
新建一個工程
接口的語法長什么樣呢?interface xingWei
男人和公狗之間有一種行為很像,都能吃都能喝
?
所以說可以用男的來使用這個接口,那我怎么樣才能和接口產生行為呢?怎么樣才能實現接口
用implements來實現接口
?
上面講的C51Con 和STC15wCon都是繼承于Con類,去實現里面的方法
我們現在講的人跟狗在特征上沒有什么特別大的聯系,可能都具有一些行為,接口的意思是把相應的行為給他提取出來,去實現里面的行為,并沒有繼承的概念,
繼承是帶有親屬關系的,比如物理老師is - a teacher? ?音樂老師is -a teacher
男人有這個行為class man implements xingWei
公狗有這個行為class dogman implements xingWei
繼承和接口是兩碼事
繼承是is -a 的關系,接口不是is -a 的關系
?運行結果
?
注意:
接口他要用interface這樣的格式????????????????interface xingWei
????????????????????????????????????????????????{
?? ?????????????????????????????????????????????????????????????????abstract void eat();
?? ?????????????????????????????????????????????????????????????????abstract void drink();
????????????????????????????????????????????????}
類要去實現接口的話呢要用implements字段,關鍵字來實現接口里面的方法
??????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????class man implements xingWei
????????????????????????????????????????????????????????????????? ? {
?? ?????????????????????????????????????????????????????????????????????????????????????????????????public void eat() {
?? ??????????????????????????????????????????????????????????????????????????? ?// TODO Auto-generated method stub
?? ??????????????????????????????????????????????????????????????????????????????????? ?System.out.println("男人吃");
????????????????????????????????????????????????????????????????????????????????? ?}
?????????????????????????????????????????????????????????????????????????????????????????? ?public void drink() {
?? ??????????????????????????????????????????????????????????????????????????????????? ?// TODO Auto-generated method stub
?? ??????????????????????????????????????????????????????????????????????????? ?System.out.println("男人喝");
?????????????????????????????????????????????????????????????????????????????????? ?}?? ?
????????????????????????????????????????????????????????????????}
接口強調的行為
接口強調的行為
接口強調的行為
總結
以上是生活随笔為你收集整理的Java:抽象方法和抽象类,抽象类应用模板方法模式,接口及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java:继承之super关键字,继承之
- 下一篇: Java:内部类之成员内部类,内部类之匿