JAVA-初步認識-第九章-抽象類-細節
一.
針對抽象類整體進行一個認識。
1.抽象類中有構造函數嗎?
對於一個問題,我們在給出答案的同時,也要說明理由,接著拿代碼驗證理由。
抽象類是不能創建對象的,所以不需要構造函數。之前說過只要類一定義,都有默認構造函數。不能創建對象,要構造函數有什麽用?雖然不能創建對象,但是抽象類有子類,其實抽象類中的構造函數可以給其子類對象進行初始化。
就是說,一個類的構造函數既可以給本類對象初始化,也可以給子類對象進行初始化。
答案是有,用於給子類對象進行初始化。
2. 抽象類可不可以不定義抽象方法
可以的。
為什麽呢?抽象類裏面一個抽象方法都沒有,那麽搞抽象類有什麽意義?
有,很少見。目的就是為了不讓該類創建對象
這種類怎麽表現不重要,後面會重點講解。
通常這個類中的方法,有方法體,但是卻沒有內容。就是說{}裏面為空,如下圖所示。
判斷是否有方法體,就看有無{},其實裏面還是有內容的,就是return,但是隱式了。它和直接用();表示是兩碼事。
一個是有方法體,沒內容。另一個是沒有方法體。
上面截圖中的類,創建對象,調用show1(),和show2()沒有意義。沒內容,運行起來有啥用?所以這種類一般都是抽象的。
後期會講到為什麽會有這種類,(聯想之前的犬科,吼叫)。
3. 抽象關鍵字不可以和哪些關鍵字共存?
private不行,以下圖為例,在方法的抽象關鍵字前面加上一個private。我覺著應該是不可以的,私有是不向外提供的,但是抽象類是要和外界聯系的,因此不能加private(個人猜測)。
道理很簡單,抽象方法是要被覆蓋,一私有的話,子類就不知道了,不知道就不能覆蓋了。因此不能和private連用(這也說明在抽象類中的抽象方法中,覆蓋是很重要的概念。) DOS報錯如下,
明明告訴我抽象需要覆蓋,現在又把它隱藏起來,那還怎麽覆蓋。
static不行,這裏說的不能和抽象關鍵字連用,抽象關鍵字都是在修飾方法。(抽象關鍵字修飾三種東西,類,方法,變量,這裏沒有交代清楚前提)
如果這成員變靜態,還需要對象嗎?就不需要了(靜態意味著可以通過類調用,而不需要對象來調用)。大家都知道抽象方法運行沒有意義,因為沒有方法體,運行它幹嘛,做什麽運算都不知道。所以靜態和abstract也不能共存。(這裏的解釋說明一點,只要是static標註的,就意味類要進行類名的調用方法
final不行,下面兩種截圖都是不可以的,一個是與覆蓋沖突,一個是與其子類沖突。
4. 抽象類和一般類有什麽異同點
不要以為抽象類很特殊,抽象類和一般類是一回事。都是描述事物的,一般類有足夠的信息來描述事物,而抽象類信息不足。
既然是抽象的,那當然也就不能建立對象。
5. 抽象類一定是個父類嗎?
是的,抽象類要使用的話,必須通過通過子類對其抽象方法進行覆蓋(對其進行抽象方法實現),不然用不了。
上述這些都是從抽象類的角度來講解的一些問題,但是是否一定有抽象類,都不一定。
JAVA-初步認識-第九章-抽象類-細節