1、物件導向
物件導向(Object Oriented)是一種新興的程式設計方法,或者是一種新的程式設計規範(paradigm),其基本思想是使用對象、類、繼承、封裝、多態等基本概念來進行程式設計。從現實世界中客觀存在的事物(即對象)出發來構造軟體系統,並且在系統構造中儘可能運用人類的自然思維方式。
什麼是OOP?
OOP,即是面象對象的編程,是與結構化編程相對的編程方式。不瞭解結構化編程也無礙。簡單地看下周遭的世界,你就能找到點OOP的特質。
例如:一輛汽車,有輪子、發動機等基本裝置,可以行駛的準系統。作為使用者,我們無需知道汽車的具體構造細節,只要知道如何操作方向盤,讓汽車行駛就可以了。
也即是,要達到目標,我們只要獲得某一物體,知道如何使用他就可以,無須關注具體的實現細節。
再比如,要組裝一輛汽車,需要很多很多的零件,而這些零件呢,都具有一定的規格,能完成某一具體的功能。比如發動機產生動力,刹車片用來制動等等。各個零件相互組合來完成更大的目標,這些零件就是要研究的具體的單元。
上面的例子中,汽車是我們要達到旅行目的所需要使用的單元,發動機、刹車片等是我們要組裝一輛汽車需要的單元。在使用過程中,我們只關注單元的規格、單元的能力,而不關心單元具體的運作細節。這些單元,在編程世界裡,就可以抽象為類,即有一定屬性、一定行為的類。
2、對象
對象是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務組成。
類的執行個體化可產生對象,一個對象的生命週期包括三個階段:產生、使用、消除。
當不存在對一個對象的引用時,該對象成為一個無用對象。Java的垃圾收集器自動掃描對象的動態記憶體區,把沒有引用的對象作為垃圾收集起來並釋放。當系統記憶體用盡或調用System.gc( )要求記憶體回收時,記憶體回收線程與系統同步運行。
3、類
類是具有相同屬性和方法的一組對象的集合,它為屬於該類的所有對象提供了統一的抽象描述,其內部包括屬性和方法兩個主要部分。在物件導向的程式設計語言中,類是一個獨立的程式單位,它應該有一個類名並包括屬性和方法兩個主要部分。
Java中的類實現包括兩個部分:類聲明和類體。
類聲明
<span style="font-size:18px;"> [public][abstract|final]class className [extends superclassName] [implements interfaceNameList]{……} 其中,修飾符public,abstract,final 說明了類的屬性,className為類名,superclassName為類的父類的名字,interfaceNameList為類所實現的介面列表。 類體classclassName{ [public | protected | private ] [static][final] [transient] [volatile] type variableName;//成員變數 [public | protected | private ] [static][final | abstract] [native] [synchronized] returnType methodName([paramList])[throws exceptionList]{ statements }//成員方法}</span>
成員變數限定詞的含義:
static:靜態變數(類變數)
final:常量;transient:暫時性變數,用於對象存檔,用於對象的序列化
volatile:貢獻變數,用於並發線程的共用
方法的實現也包括兩部分內容:方法聲明和方法體。
方法聲明
方法聲明中的限定詞的含義:
static:類方法,可通過類名直接調用
abstract:抽象方法,沒有方法體
final:方法不能被重寫
native:整合其它語言的代碼
synchronized:控制多個並發線程的訪問
方法聲明包括方法名、傳回型別和外部參數。其中參數的類型可以是單一資料型別,也可以是複合資料型別(又稱引用資料類型)。
對於單一資料型別來說,java實現的是值傳遞,方法接收參數的值,但不能改變這些參數的值。如果要改變參數的值,則用引用資料類型,因為引用資料類型傳遞給方法的是資料在記憶體中的地址,方法中對資料的操作可以改變資料的值。
方法體
方法體是對方法的實現,它包括局部變數的聲明以及所有合法的Java指令。方法體中聲明的局部變數的範圍在該方法內部。若局部變數與類的成員變數同名,則類的成員變數被隱藏。
為了區別參數和類的成員變數,我們必須使用this。this用在一個方法中引用當前對象,它的值是調用該方法的對象。返回值須與傳回型別一致,或者完全相同,或是其子類。當傳回型別是介面時,返回值必須實現該介面。
構造方法
構造方法是一個特殊的方法。Java 中的每個類都有構造方法,用來初始化該類的一個對象。
構造方法具有和類名相同的名稱,而且不返回任何資料類型。
重載經常用於構造方法。
構造方法只能由new運算子調用
4、物件導向的基本特性
封裝
封裝性就是儘可能的隱藏對象內部細節,對外形成一道邊界,只保留有限的介面和方法與外界進行互動。封裝的原則是使對象以外的部分不能隨意的訪問和操作對象的內部屬性,從而避免了外界對對象內部屬性的破壞。
可以通過對類的成員設定一定的存取權限,實作類別中成員的資訊隱藏
private:類中限定為private的成員,只能被這個類本身訪問。如果一個類的構造方法聲明為private,則其它類不能產生該類的一個執行個體。
default:類中不加任何存取權限限定的成員屬於預設的(default)訪問狀態,可以被這個類本身和同一個包中的類所訪問。
protected:類中限定為protected的成員,可以被這個類本身、它的子類(包括同一個包中以及不同包中的子類)和同一個包中的所有其他的類訪問。
public:類中限定為public的成員,可以被所有的類訪問。
繼承
子類的對象擁有父類的全部屬性與方法,稱作子類對父類的繼承。
Java中父類可以擁有多個子類,但是子類只能繼承一個父類,稱為單繼承。繼承實現了代碼的複用。Java中所有的類都是通過直接或間接地繼承java.lang.Object類得到的。
子類不能繼承父類中存取權限為private的成員變數和方法。
子類可以重寫父類的方法,即命名與父類同名的成員變數。
Java中通過super來實現對父類成員的訪問,super用來引用當前對象的父類。super 的使用有三種情況:
訪問父類被隱藏的成員變數,如:super.variable;
調用父類中被重寫的方法,如:super.Method([paramlist]),super()調用父類構造方法;
調用父類的建構函式,如:super([paramlist]);
多態
對象的多態性是指在父類中定義的屬性或方法被子類繼承之後,可以具有不同的資料類型或表現出不同的行為。這使得同一個屬性或方法在父類及其各個子類中具有不同的語義。例如:"幾何圖形"的"繪圖"方法,"橢圓"和"多邊形"都是"幾何圖"的子類,其"繪圖"方法功能不同。
Java的多態性體現在兩個方面:由方法重載實現的靜態多態性(編譯時間多態)和方法重寫實現的動態多態性(運行時多態)。
編譯時間多態:在編譯階段,具體調用哪個被重載的方法,編譯器會根據參數的不同來靜態確定調用相應的方法。
運行時多態:由於子類繼承了父類所有的屬性(私人的除外),所以子類對象可以作為父類對象使用。程式中凡是使用父類對象的地方,都可以用子類對象來代替。一個對象可以通過引用子類的執行個體來調用子類的方法。
重載(Overloading)
方法重載是讓類以統一的方式處理不同資料類型的手段。
一個類中可以建立多個方法,它們具有相同的名字,但具有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型來決定具體使用哪個方法。
返回值類型可以相同也可以不相同,無法以返回型別作為重載函數的區分標準。
重寫(Overriding)
子類對父類的方法進行重新編寫。如果在子類中的方法與其父類有相同的的方法名、傳回型別和參數表,我們說該方法被重寫 (Overriding)。
如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
子類函數的訪問修飾許可權不能低於父類的。
publicclass Human{ // Human即是類的名字 String name;// 這是定義屬性 // 這是定義行為 public void speack(String words){ System.out.println(words); } }
<span style="font-size:18px;">HumanzhangSan = new Human(); </span>
這樣就建立了 zhangSan這個人了。HumanzhangSan 的寫法類似 int i 。著重講解後面new Human()
類與構造方法
在由類執行個體化一個具體的對象的時候,構造方法就會執行。比如Human這個類,定義了2個構造方法,一個無參數,一個有參數。看清構造方法的形式---無返回值。
<span style="font-size:18px;">publicclass Human{ Stringid; // 這是標識對象唯一性的屬性 Stringname; // 這是new Human()時調用的構造方法 Human(){ } // 這是 newHuman("111111111")時調用的構造方法 Human(StringshenFenZheng){ id= shenFenZheng; } } </span>
newHuman() 即調用無參數的構造方法建立一個 Human執行個體對象。
類的方法
方法是一個類行為的支撐,類所有的方法定義了這個類的能力範圍,具體的實現過程則寫在方法的內容中。方法的定義遵循一定的格式,即:
修飾符 返回值類型 方法名稱(參數類型 參數名)
<span style="font-size:18px;">publicvoid speack(String words) </span>
這個例子中:
修飾符:public (這個繁瑣以後講)
返回值:void (空,即不返回值)
方法名稱:speak
參數類型:String ( 字串類型 )
參數名稱: words(這是在 方法內部該變數的名稱)
類的屬性與存取方法
作為OOP原則之一:資料隱藏(或稱為封裝)。對象的屬性不能直接被外部對象訪問,而應該通過對象自身提供的get(取)、set(存)方法來完成。
<span style="font-size:18px;">publicString getName() { return name; } publicvoid setName(String aName) { name = aName; // 這裡的name是類中的屬性,該類的所有方法都可以直接存取、賦值 } </span>
一個較為合理的類
至此,一個類的片段我們都有了,下面拼接起來吧:
<span style="font-size:18px;">publicclass Human { String id; // 類的屬性變數 String name; // 類的屬性變數 // 這是new Human()時調用的構造方法 Human() { } // 這是 new Human("111111111")時調用的構造方法 Human(String shenFenZheng) { id = shenFenZheng; } public String getId() { return id; } public void setId(String shenFenZheng){ id = shenFenZheng; } // 取name內容的方法 public String getName() { return name; } // 修改name內容的方法 public void setName(String aName) { name = aName; } // 類的行為 public void speak(String words) { System.out.println(words); } } 使用執行個體:publicclass Meeting { public static void main(String[] args){ // 一個小娃出生了 Human zhangSan = new Human(); // 報了戶口,社會安全號碼是 zhangSan.setId("1234567890123"); // 家長給起了個名字 zhangSan.setName("張三"); // 又一個小娃出生了 Human xiaoMing = new Human(); xiaoMing.setId("3210987654321"); xiaoMing.setName("小明"); // 兩人見面了,張三先打招呼 zhangSan.speak("你好!我是"+zhangSan.getName()); // 出於禮貌,小明回了句 xiaoMing.speak("你好!我是"+xiaoMing.getName()+",很高興認識你"); } } </span>