天天看點

Java中的接口抽象方法與C++中的抽象類純虛函數

Java中的接口抽象方法與C++中的抽象類純虛函數

接着我的文章當中C++靜态綁定和動态綁定的例子.

一個簡單的形狀類:

如下:

形狀表示一種抽象的概念.是以如果是在Java中的話Figure應該定義為一個抽象類.類名前用abstract來修飾.

在C++中,抽象函數不是直接用abstract關鍵字來指定的.

在C++中包含有純虛函數的類的被稱為抽象類.這個跟Java中抽象方法有相同點.

在C++中定義純虛函數格式如下:

virtual<傳回值類型><函數名>(<形式參數表>)=0;

即純虛函數的定義是在虛函數定義的基礎上,再讓函數等于0即可.這隻是一種表示純虛函數的标志.而不是指它的傳回值是0.

上面的例子中.對于對一個形狀的面積來講确實是一個無法确定的概念,就好像說

如果調用這個Figure類的求面積方法area()的結果是未定義的一樣.

因為隻有針對具體的形狀如圓,三角形.矩形等才有意義.

與C++的抽象類中純虛函數最對應的是Java的抽象類中的抽象方法.

在Java中如果一個類中有一個方法是抽象的,那麼這個類也就是抽象的.需要用abstract修飾類名.(除非是一個特殊的類型如枚舉).

不管是對于 C++還是Java而言,抽象類中抽象方法(C++中的純虛函數)

Java中方法修飾中的abstract與private,static,final關鍵字是不互斥的.(道理顯然)

顯然可見的是,抽象類不能執行個體化,主要是因為調用抽象類中的抽象方法是沒有意義的.

在Java中下面的代碼有出現編譯錯誤,原因就是ColoredPoint類中的super關鍵字試圖通路Point類中的抽象toString()方法.

但是在抽象類中的方法中可以調用抽象方法:

如下測試所示(下面程式運作時沒有任何輸出,原因可能是因為move()方法調用的toString()是Point類中的toString()而不是ColoredPoint類中的toString().