首先要說明的是:抽象類中可以定義構造方法。
在之前認為:1,抽象類是不能例項化的;2,定義抽象類肯定是用來例項化的;3,抽象類中沒有建構函式。
這三句話第一句肯定是正確的,第二句和第三句呢,定義抽象類一定要用來繼承使用嗎?抽象類中沒有建構函式嗎? (這兩個問題會在下面詳細解答)
就拿前段時間做的圖書館維修管理系統中sqlhelper說吧
**如下:
[csharp]view plain
copy
print?
"font-size:18px;"
>
///
/// 資料訪問抽象類
///
public
abstract
class
sqlhelper
這樣在d層中,就可以直接用抽象類sqlhelper中的方法啦。
這樣做有什麼好處:1,抽象類直接使用省去了例項化。(分析記憶體知:類的例項化一要在堆中new出物件,二要在棧中分配空間指向堆中new出的物件),這兩步都省去了。
2,抽象類中的靜態方法是存在記憶體中的,用的時候直接去記憶體中去取,這樣還是提高銷量。
直接使用需注意的:抽象類中的方法必須為靜態的。
一直都說抽象函式不能被例項化而建構函式是初始化物件的,好像就暗含著抽象類中沒有建構函式或者說抽象類中的建構函式沒有作用,書上說抽象類不能被例項化至於建構函式有沒有,我們試一試不就知道了。
首先來看一下抽象類中沒有建構函式的例子。旨在說明建構函式的作用。
例項1:(c#控制台**)
[csharp]view plain
copy
print?
class
program
} ///
/// 定義抽象類
///
public
abstract
class
baseabstract
public
class
testabstract:baseabstract
}
例項1結果:
在main函式中,例項化testabstract子類時首先去找子類的建構函式進行初始化。至於抽象類中建構函式有沒有呼叫,在例項1中還看不出來。下面請看例項2.
例項2:
[csharp]view plain
copy
print?
///
/// 定義抽象類
///
public
abstract
class
baseabstract
} public
class
testabstract:baseabstract
}
例項2在例項1的基礎上加建構函式。首先看執行會不會提示編譯錯誤,如果錯誤說明抽象類中不能有建構函式,如過通過,再看看建構函式是不是有用,會不會被子類的覆蓋。
執行結果:
如結果所示,抽象類中的建構函式中的內容也列印出來了,說明抽象類中的建構函式是有作用的。
子類繼承抽象類時,建構函式不會被覆蓋。 而且,在例項化子類物件時首先呼叫的是抽象類中的建構函式再呼叫子類中的。
因此,在抽象類中可以使用建構函式封裝繼承子類公共的東西。
網上有很多篇文章說抽象函式中不能有建構函式,在csdn上也有幾篇說即使有建構函式也用不上的,我也就相信了,直到現在學習分析記憶體,才想到試一試,實驗結果大家也都看到了,跟他們說的不一樣。在今後的學習中要帶著懷疑的態度去學習知識,不要一味的相信網上說的,也不要一味的不相信他們,遇到分歧,要想到先試一試,事實證明一切。
抽象類的構造方法
抽象類不能被例項化 也就是不能直接 new 抽象類 如果被例項化,就會報錯,編譯無法通過。只有抽象類的非抽象子類可以建立物件。抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。抽象類中的抽象方法只是宣告,不包含方法體,就是不給出方法的具體實現也就是方法的具體功能。構造方法,類方法 用sta...
抽象類中構造方法的使用
抽象類中構造方法的使用 抽象類無法被例項化,只能通過子類的繼承 extends 乙個子類只能繼承乙個抽象類 並且子類必須全部覆寫抽象類中的全部抽象方法 package extends abstract class persons 宣告乙個抽象方法 public abstract string tal...
PHP抽象類構造
那麼在php中也是一樣的,把乙個類進行抽象,可以指明某個類的一般行為,這個類可以是乙個模板,而繼承他的子類中的方法就要去 具體的實現模板的相應功能 注意這裡是模板的全部功能 下面是我總結的一些注意點 1.定義的方法,子類必須完全實現這個抽象中所有的方法。2.不能從抽象類建立物件,物件要讓繼承他的子類...