標籤:over 解構函式 核心 原來 interface 全面 color 產生 這一
2017-10-09 17:23:52
在物件導向技術中,將客觀世界中的一個事物作為一個對象來考慮,比如有個張先生,他就是一個對象。每個對象都有自己的屬性和行為。張先生的屬性根據需要有姓名、性別、身高等,他的行為有開車,閱讀,跑步等。從程式設計的角度來看,事物的屬性可以用變數來描述,行為則用方法來反映。
一、物件導向設計的核心技術
物件導向程式設計的核心技術主要是封裝、繼承和多態性。
類是封裝的基本單元。通過封裝可以隱藏類的實現細節,也可以避免對類中屬性的直接操作。可以通過類的公用介面訪問類中的變數,而不必知道這個介面的具體實現方式。只要這個方法的名字和參數不變,即使類中的變數被重新定義,或方法的代碼被修改,對類中的變數的訪問也不會受到影響。比如,你在電腦上安裝了一個音效卡,你不必知道音效卡的內部結構,也不必知道功能如何?的,因為實現音效卡功能的繼承電路被封裝了。你只要知道音效卡應該裝在電腦主板的什麼位置,其他的裝置如音箱,光碟機怎樣和音效卡串連就可以了。
繼承是對類的功能的重用和擴充。通過對某一個類的繼承產生一個新的子類,子類既有從某個類中繼承下來的功能,又可以自行定義自己的變數和方法,產生新的功能。
多態性指的是方法的名字相同,但實現不同。即“同一介面,多個方法”。如有三個方法,分別用來計算圓、矩形、三角形面積,他們的名字可以都叫做area。
二、類的結構
Java是一種完全物件導向對程式設計語言。他所有的屬性類型和方法都封裝在類中,Java繼承了C++的有點,但放棄了那些含糊,複雜和容易出錯的特性。Java所實現的物件導向的特性,降低了程式的複雜性,實現了代碼的可重用性,提高了運行效率。
[修飾符]class 類名 [extends 超類名][implements 介面名]
{
類主體
}
修飾符包含存取權限有兩種,要麼預設,要麼public。如果在一個源檔案中有多個類的話,只能有一個類的許可權可以是public,其餘的類的許可權必須是預設。public類的名字應該和檔案同名,同時main函數也要放在該類中。Java中public許可權指所有的類都可以訪問,而預設的存取權限則是指只允許同一個包的類進行訪問。
final:final修飾的類為最終類,這種類不能被繼承。
abstract:抽象類別,不能執行個體化
[修飾符][static][final][transient] 變數類型 變數名;
修飾符:預設的,public,protected,private
static:靜態變數
final:常量
transient:臨時變數
[修飾符]傳回型別 方法名(參數表)[throws <異常類>]
{
方法體;
}
這裡的修飾符包含存取權限,共有四種,即:預設的,public,protected,private。
static:靜態方法
abstract:抽象方法(無方法體的方法)
final:最終方法(不能被子類繼承的方法)
throws:拋出異常
public:所有的類都能訪問
protected:不同包的子類可以訪問
預設:同一包能訪問
private:同一類可以訪問
三、對象的構造和初始化以及對象的銷毀
構造方法沒有傳回值,且構造方法的名字應該和這個類一致。
例如:Date(int m,int n){...}
在建立對象的時候會自動調用相應的構造方法。
對象的生命週期是指對象的建立、使用和銷毀這一過程。對象的銷毀是指當對象使用完成後,釋放對象佔用的資源。
Java能自動判斷對象是否在使用,並自動銷毀不在使用的對象,收回對象所佔用的資源。在這種模式下我們並不知道對象銷毀的具體時間。
此外,我們可以在程式中定義finalize()方法,使得對象在銷毀之前執行該方法。該方法的基本格式如下:
[修飾符]void finalize(){}
java提供finalize()方法,記憶體回收行程準備釋放記憶體的時候,會先調用finalize()。
(1).對象不一定會被回收。
(2).記憶體回收不是解構函式。
(3).記憶體回收只與記憶體有關。
(4).記憶體回收和finalize()都是靠不住的,只要JVM還沒有快到耗盡記憶體的地步,它是不會浪費時間進行記憶體回收的。
四、靜態成員
類中有一種特殊的成員,他不屬於某一個單獨的對象,而是屬於整個類所有。另外,Java中static不可以用來修飾局部變數。靜態成員函數只能訪問靜態成員變數。
五、類的繼承
如果要擴充原有的程式的功能,可以對原來的類進行修改或增加一個新類,但是這樣就不符合開閉原則了。同時,也會影響原來的類的相關代碼,或者造成代碼的重複。
一種好的方法是通過繼承來重用已有的代碼,同時增加新的代碼來進行功能的擴充。
繼承是物件導向設計的重要方法,被繼承的類稱為超類,從超類派生的新類稱為子類。子類中包含兩個部分,一個是從超類中繼承下來的變數和方法,一個是自己新增加的方法和變數。
Java中只支援單重繼承,不支援多重繼承,所以一個類只能有一個超類。
[修飾符]class 子類名 extends 超類名
{...}
子類的對象也是超類的對象,超類的對象不一定是子類的對象。
成員變數的繼承規則:子類只繼承超類中非private的部分;
隱藏原則(hiding):子類的成員變數和超類的成員變數同名的時候,超類的成員變數被隱藏。
成員方法的繼承規則:子類只繼承超類中非private的部分;
覆蓋原則(Override):子類的成員方法和超類的成員方法同名的時候,超類的成員方法被子類的成員方法覆蓋。
在調用子類的構造方法的時候,需要先調用超類的構造方法,子類的構造方法的參數的前面幾個,是給超類的構造方法使用的。在子類的構造方法體中,使用super進行顯示的調用超類的構造方法,並將此語句放在構造方法體的最前面。如果超類中有預設的構造方法,那麼在子類的構造方法中,可以不顯示的調用超類的構造方法。
null:表示Null 物件,即沒有建立類的任何執行個體。
this:代指當前的對象,是對象的引用。訪問本類的成員,this.<變數名>,this.<方法名>,調用本類的構造方法this(參數表);
super:超類的引用,可以使用super來引用被子類屏蔽的超類的成員,super.<變數名>,super.<方法名>,調用超類的構造方法super(參數表);
六、最終類和抽象類別
被final修飾的類和方法稱為最終類和最終方法,這種類無法被繼承,這種方法不會在子類中被覆蓋,也就是說子類中不能有和此方法同名的方法。
final class Last{...};
public final void printsuper(參數表){...};
抽象方法是必須在子類被覆蓋的方法,在聲明的時候,用關鍵字abstract將方法說明為抽象方法,並不設方法體。
含有抽象方法的類為抽象類別,也需要用abstract修飾,他是一種不能執行個體化的類。
abstract class <類名>{...abstract 方法}
proected abstract void write();
注意:對於成員方法,不能同時使用static和abstract說明,因為static不用執行個體化就可以調用,而abstract必須進行執行個體化實現。
對於類,不能同時使用final和abstract進行修飾,因為這兩種方式明顯是相反的。
七、類的多態性
多態是指同一名稱,多種實現。多態的實現主要通過重載(overloading)和覆蓋(override)來完成。
方法的名字相同,但參數不同(注意僅傳回值不同不能算作重載),稱為重載。在執行的時候,根據參數的不同來決定執行哪個方法。
子類和超類中有同名的方法,且參數也相同,子類中的方法將覆蓋超類的方法。
* 前期綁定和後期綁定的概念
對於方法的重載,在程式編譯的時候,根據調用語句中給出的參數,就可以決定在程式中執行時調用的版本,這種稱為編譯時間的綁定,也叫做前期綁定;
對於方法的覆蓋,要在程式執行時,才能決定調用同名方法的版本,這稱為運行時的綁定,也叫做後期綁定。
八、介面
在Java中,由於不支援多重繼承,所以引入了介面的概念。一個類可以有一個超類和多個介面。Java中的物件導向編程也被戲稱為面向介面編程。足見介面的概念的重要性。
介面是一個特殊的類,他是由靜態常量和抽象方法組成的,並且不包含變數和方法的實現。
[修飾符] interface 介面名{...}
其中修飾符可以是public或者預設存取控制。
介面中的變數預設是static final ,且必須被賦初值。如果介面是public,那麼介面中的成員都隱含是public存取權限。
一個介面可以被一個類或者多個類實現。當一個類實現了一個介面,它必須實現這個介面中的所有方法,這些方法都要被說明成public。使用關鍵詞implements實現介面。
class 類名 implements 介面1,介面2...
Java-Java物件導向程式設計