抽象類能實例化嗎?
1.抽象類不能直接實例化,并且對抽象類使用 new 運算符是編譯時錯誤。雖然一些變量和值在編譯時的類型可以是抽象的,但是這樣的變量和值必須或者為 null,或者含有對非抽象類的實例的引用(此非抽象類是從抽象類派生的)。
2.抽象類往往用來表征對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。通常在編程語句中用 abstract 修飾的類是抽象類。在C++中,含有純虛擬函數的類稱為抽象類,它不能生成對象;在java中,含有抽象方法的類稱為抽象類,同樣不能生成對象。抽象類是不完整的,它只能用作基類。在面向對象方法中,抽象類主要用來進行類型隱藏和充當全局變量的角色。只要把這些東西對應到生活中的概念就明白面向對象的設計本身來源于生活,我們對事物的理解本身都是一樣的哲學,理解概念之后怎么寫代碼就更容易掌握。
3.抽象類是表示部分地實現功能,比如把某些已經確定的功能實現了,而抽象的功能則表示未實現,因為不能確定子類用什么方式實現它或者說把可能性和機會留給子類,比如對于寵物這個抽象類"睡覺“這個方法就是抽象的,因為子類的實現方法各有差異,狗經常待在墻邊陰涼處睡覺,而貓則爬到樹上睡覺,我們父類中不能把這個”個性“的東西放入”共性“的父類中,“共性”是它們都會睡覺,但具體怎么睡覺則是”個性“,因此只能把它弄成抽象的,把機會留給子類來實現它。抽象類和抽象方法的目的是相同的。當子類實現這些抽象方法后就是叫”實現“,如果這個方法在父類中已經實現了不是抽象的而子類再來實現一次就是“覆蓋”或“重寫“了父類的方法,這2個都叫實現了”多態“特性。“多態”就是某個“共性”在各個子類中表現出不同的“個性”,但都同時保留著“共性”。
例如:
Pet[] pets = new Pet[] { new Dog(), new Cat()};
for(int i = 0;i < pets.length; i++) {
pets[i].doSleep(); // 這時每個個體的”個性“表現出現了,就是”多態“。程序是在用它們聲明的”共性“ doSleep 來調用這個方法的。這里面就是用"實現”/”覆蓋“/"改寫”父類方法達到的。覆蓋了的方法在調用時會找對應的子類的方法而不是直接用父類提供的,在這里貓會按貓的習慣睡覺,狗會按狗的習慣睡覺。
}