[Java入門筆記] 物件導向編程基礎(一):類和對象,java物件導向編程
什麼是物件導向編程?
我們先來看看幾個概念:
面向過程程式設計
面向過程,是根據事情發展的步驟,按進行的順序過程劃分,面向過程其實是最為實際的一種思考方式,可以說面向過程是一種基礎的方法,它考慮的是實際地實現,一般的面向過程是從上往下步步求精。
例如:如果你要吃飯,那需要:“買菜-洗菜-做飯-吃飯”等等,一步一步的來設計,就是面向過程
結構化程式設計
結構化程式設計是主張通過按功能來分析系統需求的一種設計思想。其主要原則可以概括為:
自頂向下:程式設計時,應先考慮總體,後考慮細節;先考慮全域目標,後考慮局部目標。不要一開始就過多追求眾多的細節,先從最上層總目標開始設計,逐步使問題具體化。
逐步細化:對複雜問題,應設計一些子目標作為過渡,逐步細化。
模組化設計:一個複雜問題,肯定是由若干稍簡單的問題構成。模組化是把程式要解決的總目標分解為子目標,再進一步分解為具體的小目標,把每一個小目標稱為一個模組。
結構化程式設計首先採用結構化的程式分析方法進行功能需求分析,然後使用結構化設計方法對系統進行設計,最後採用結構化編程方式進行系統實現。
這種採用結構化程式設計主張按功能把軟體逐步細化,因此這種方法也被稱為面向功能的程式設計方法。
結構化程式設計裡最小的程式單元是函數,每個函數都負責完成一個功能,作為程式入口的函數被稱作主函數,由主函數調用其他函數,其他函數再調用其他一些函數,從而完成整個程式的功能。
圖中可以看出,結構化程式設計自頂而下的設計方式,將一些功能定義成函數模組,再一步步細化功能。結構化程式設計具有兩個不足之處:
1、設計不夠直觀,需要將客觀世界的模型分解成一個一個的功能,每個功能處理一定的資料。
2、可擴充性不強,當其中某一個函數需要修改其功能是,需要自上而下地修改模組結構。
物件導向程式設計
物件導向就是針對一個功能,而進行模組的劃分,這部分和結構化程式很相似,但是有不同點,就是對象有繼承,多態等形式,使得你沒必要在大體相同地方要重新寫程式。它從現實世界中客觀存在的事物出發來構造軟體系統,強調以現實世界中的事物(既對象)來思考問題。
使用物件導向方式開發,其最小的程式單元是類,這些類可以產生系統中的多個對象,而這些對象則直接反應為客觀世界中的各種事物,如:
有“人”這樣一個類,他有什麼特徵(年齡、體重等),有什麼功能(吃飯、行走等),如果我們要完成上面面向過程中的功能,我們只需調用某個“人”對象的“食”方法即可。
程式的三種基本結構
無論是上面的哪種設計思想設計和實現程式,程式的設計都有可能會涉及都下面三種程式的結構:
順序結構
順序結構表示程式中的各操作是按照它們出現的先後順序執行的。
選擇結構
選擇結構表示程式的處理步驟出現了分支,它需要根據某一特定的條件選擇其中的一個分支執行。選擇結構有單選擇、雙選擇和多選擇三種形式。
迴圈結構
迴圈結構表示程式反覆執行某個或某些操作,直到某條件為假(或為真)時才可終止迴圈。在迴圈結構中最主要的是:什麼情況下執行迴圈?哪些操作需要迴圈執行?迴圈結構的基本形式有兩種:當型迴圈和直到型迴圈。
當型迴圈:表示先判斷條件,當滿足給定的條件時執行迴圈體,並且在迴圈終端處流程自動返回到迴圈入口;如果條件不滿足,則退出迴圈體直接到達流程出口處。因為是"當條件滿足時執行迴圈",即先判斷後執行,所以稱為當型迴圈。
直到型迴圈:表示從結構入口處直接執行迴圈體,在迴圈終端處判斷條件,如果條件不滿足,返回入口處繼續執行迴圈體,直到條件為真時再退出迴圈到達流程出口處,是先執行後判斷。因為是"直到條件為真時為止",所以稱為直到型迴圈。
類和對象
物件導向的程式設計過程中有兩個重要的概念:類(class)和對象(Object)。
什麼是類?
類是對現實生活中一類具有共同特徵的事物的抽象,它是一個抽象的概念。
比如小轎車、摩托、卡車、公交車,他們都有共同的特徵,能夠機動化的行走以及運載人或物品。所以我們可以把他們抽象為一個類:車。
什麼是對象?
對象是類這個抽象概念的一個具體體現,比如有一個類叫“人”,而這個叫張三的人、那一個叫李四的人,都是“人”這個類的具體的體現,所以他們是對象。需要注意的是:對象一定具體到某個個體,張三不一定是一個對象,因為可以有很多個叫張三的,一定是“這一個張三”才是一個對象。
如何定義類
定義文法:
[修飾符] class 類名{ //類的內容}
如:
public class Person{ }
我們定義了叫“Person”的一個類。
因為Java語言是區分大小寫,所以需要注意關鍵字的大小寫問題,類名可以自己任意定義,建議起名要具有實際意義以及每個單字首大寫。
對於一個類而言,它包含三種最常見的成員:構造器、Field和方法。三個成員都可以定義0個或多個。
構造器
構造器是一個類建立對象的根本途徑,如果一個類沒有構造器,通常無法建立對象,所以系統會為每一個類預設定義一個構造器,在不明確定義的情況下,它是隱藏的,如果明確定義了,則不會預設定義。
定義構造器的文法:
[修飾符] 類名([形參 參數名]){
功能代碼
}
修飾符可以是public private protected 或者不寫。
例:
public class Person{ public Person(){}}
Field(屬性)
Field用於定義該類或該類執行個體所包含的狀態資料、描述對象的特徵等,定義文法如下:
[修飾符] 資料類型 屬性名稱 = 值;
例:
public class Person{ public String name; public int age;}
Person(人)這個類有兩個Filed,分別用來描述姓名、年齡。上面這個例子中沒有為其定義一個構造器,所以系統會為其預設一個構造器:public Person(){}
方法
方法用來定義該類或該類執行個體的行為特徵或功能實現。
文法如下:
[修飾符] 傳回值 方法名([形參 參數名]){ //功能代碼}
例:
public class Person{ //定義一個Person類 public String name; //具有Field 姓名(name)、年齡(age) public int age; public Person(){} //第一個構造方法 public Person(String n, int a){ //第二個構造方法,有兩個參數n和a,在建立對象是如果調用了該構造方法就會將name屬性設定為傳進來的n,age為a。 name = n; age = a; } public void eat(String s){ //方法,類比吃東西的功能 System.out.println(name + "在吃" + s); } public void sleep(int hour){ //方法,類比睡覺功能 System.out.println(name + "睡了" + hour + "個小時"); }}
對象的建立和使用
前面已經說明過,建立對象的根本途徑是構造器,通過new關鍵字調用該類的構造器來建立一個對象,如:
上面我們已經定義了一個“人”類,我們通過它建立一個對象。
Person p; //定義一個Person類型的變數p = new Person(); //通過new關鍵字Person類的第一個構造器,返回一個Person執行個體,也就是該對象。
也可以這樣:
Person p = new Person("張三", 20); //我們將上面的兩步簡化為一步,並且調用第二個構造方法,傳遞兩個參數,為這個對象設定了姓名和年齡。
有了對象,我們就可以使用它了:
使用對象:使用“.”進行以下操作 給類的屬性賦值:對象名.屬性 調用類的方法:對象名.方法名()
System.out.println(p.name); //將這個對象的名稱列印出來p.sleep(5); //調用睡覺的方法
建立和使用對象在記憶體中的樣本
上面我們有這樣一行代碼:Person p = new Person("張三", 20);
這行代碼建立了一個Person對象,這個對象被賦值給p變數。
這行代碼中實際產生了四個東西,p變數和Person對象、"張三"對象、數字20
當有等號時會先執行等號右邊的代碼new Person("張三", 20),這句代碼中調用的是public Person(String n, int a)構造方法,而我們發現,在這個方法中也有兩個變數String類型的n和int類型的a,所以執行這句話時記憶體中是這樣的:
產生兩個變數s和a,s是一個參考型別的變數,它在棧記憶體中儲存的是一個堆記憶體中的記憶體位址,該地址指向堆記憶體中String類型的一個對象,啊變數是一個int類型資料,所以它的數值直接儲存在棧記憶體中。
調用構造方法首先會建立一個Person類型的對象,對象中有name和age兩個屬性:
構造方法中有兩句代碼
name = n; age = a;
此時會將兩個值賦給給對象
name = n:指向同一個對象
age = a:將值複製給age
繼續執行,構造方法結束,清除a變數和s變數,執行語句等號右邊代碼,建立一個Person類型變數p,該變數指向通過構造方法返回的Person對象
對象建立完成。
謝謝大家閱讀,如有錯誤之處,歡迎大家指正。( ^_^ )