有人看到 Java 里虛函數和純虛函數這兩個名詞,接觸 Java 很久了並沒有聽說過這兩個詞,查詢了一番才明白。
-
Java 虛函數
虛函數的存在是為了多態。C++ 中普通成員函數加上 virtual 關鍵字就成為虛函數。
虛函數和純虛函數,這個是 C++ 的說法,Java 中其實沒有虛函數的概念,它的普通函數就相當於 C++ 的虛函數,動態綁定是 Java 的默認行為。如果 Java 中不希望某個函數具有虛函數特性,可以加上 final 關鍵字變成非虛函數。
-
Java 純虛函數(抽象函數)
抽象函數或者說是純虛函數的存在是為了定義接口。
C++ 中純虛函數形式為:virtual void print() = 0;
Java 中純虛函數形式為:abstract void print();
注:在抽象函數方面 C++ 和 Java 還是換湯不換葯。
-
Java 抽象類
抽象類的存在是因為父類中既包括子類共性函數的具體定義,也包括需要子類各自實現的函數接口。抽象類中可以有數據成員和非抽象方法。
C++ 中抽象類只需要包括純虛函數,既是一個抽象類。如果僅僅包括虛函數,不能定義為抽象類,因為類中其實沒有抽象的概念。
Java 抽象類是用 abstract 修飾聲明的類。
注:抽象類其實是一個半虛半實的東西,可以全部為虛,這時候變成接口。
-
Java 接口
接口的存在是為了形成一種規約。接口中不能有普通成員變量,也不能具有非純虛函數。
C++ 中接口其實就是全虛基類。
Java 中接口是用 interface 修飾的類。
注:接口就是虛到極點的抽象類。
-
總結
C++ 虛函數 == Java 普通函數
C++ 純虛函數 == Java 抽象函數
C++ 抽象類 == Java 抽象類
C++ 虛基類 == Java 接口
參考: