咱們先來看看幾個概念:編程
面向過程,是根據事情發展的步驟,按進行的順序過程劃分,面向過程實際上是最爲實際的一種思考方式,能夠說面向過程是一種基礎的方法,它考慮的是實際地實現,通常的面向過程是從上往下步步求精。模塊化
例如:若是你要吃飯,那須要:「買菜-洗菜-作飯-吃飯」等等,一步一步的來設計,就是面向過程函數
結構化程序設計是主張經過按功能來分析系統需求的一種設計思想。其主要原則能夠歸納爲:spa
自頂向下:程序設計時,應先考慮整體,後考慮細節;先考慮全局目標,後考慮局部目標。不要一開始就過多追求衆多的細節,先從最上層總目標開始設計,逐步使問題具體化。設計
逐步細化:對複雜問題,應設計一些子目標做爲過渡,逐步細化。對象
模塊化設計:一個複雜問題,確定是由若干稍簡單的問題構成。模塊化是把程序要解決的總目標分解爲子目標,再進一步分解爲具體的小目標,把每個小目標稱爲一個模塊。繼承
結構化程序設計首先採用結構化的程序分析方法進行功能需求分析,而後使用結構化設計方法對系統進行設計,最後採用結構化編程方式進行系統實現。
這種採用結構化程序設計主張按功能把軟件逐步細化,所以這種方法也被稱爲面向功能的程序設計方法。內存
結構化程序設計裏最小的程序單元是函數,每一個函數都負責完成一個功能,做爲程序入口的函數被稱做主函數,由主函數調用其餘函數,其餘函數再調用其餘一些函數,從而完成整個程序的功能。開發
圖中能夠看出,結構化程序設計自頂而下的設計方式,將一些功能定義成函數模塊,再一步步細化功能。結構化程序設計具備兩個不足之處:面向對象編程
一、設計不夠直觀,須要將客觀世界的模型分解成一個一個的功能,每一個功能處理必定的數據。
二、可擴展性不強,當其中某一個函數須要修改其功能是,須要自上而下地修改模塊結構。
面向對象就是針對一個功能,而進行模塊的劃分,這部分和結構化程序很類似,可是有不一樣點,就是對象有繼承,多態等形式,使得你不必在大致相同地方要從新寫程序。它從現實世界中客觀存在的事物出發來構造軟件系統,強調以現實世界中的事物(既對象)來思考問題。
使用面向對象方式開發,其最小的程序單元是類,這些類能夠生成系統中的多個對象,而這些對象則直接反應爲客觀世界中的各類事物,如:
有「人」這樣一個類,他有什麼特徵(年齡、體重等),有什麼功能(吃飯、行走等),若是咱們要完成上面面向過程當中的功能,咱們只需調用某個「人」對象的「食」方法便可。
不管是上面的哪一種設計思想設計和實現程序,程序的設計都有可能會涉及都下面三種程序的結構:
順序結構表示程序中的各操做是按照它們出現的前後順序執行的。
選擇結構表示程序的處理步驟出現了分支,它須要根據某一特定的條件選擇其中的一個分支執行。選擇結構有單選擇、雙選擇和多選擇三種形式。
循環結構表示程序反覆執行某個或某些操做,直到某條件爲假(或爲真)時纔可終止循環。在循環結構中最主要的是:什麼狀況下執行循環?哪些操做須要循環執行?循環結構的基本形式有兩種:當型循環和直到型循環。
當型循環:表示先判斷條件,當知足給定的條件時執行循環體,而且在循環終端處流程自動返回到循環入口;若是條件不知足,則退出循環體直接到達流程出口處。由於是"當條件知足時執行循環",即先判斷後執行,因此稱爲當型循環。
直到型循環:表示從結構入口處直接執行循環體,在循環終端處判斷條件,若是條件不知足,返回入口處繼續執行循環體,直到條件爲真時再退出循環到達流程出口處,是先執行後判斷。由於是"直到條件爲真時爲止",因此稱爲直到型循環。
面向對象的程序設計過程當中有兩個重要的概念:類(class)和對象(Object)。
類是對現實生活中一類具備共同特徵的事物的抽象,它是一個抽象的概念。
好比小轎車、摩托、卡車、公交車,他們都有共同的特徵,可以機動化的行走以及運載人或物品。因此咱們能夠把他們抽象爲一個類:車。
對象是類這個抽象概念的一個具體體現,好比有一個類叫「人」,而這個叫張三的人、那一個叫李四的人,都是「人」這個類的具體的體現,因此他們是對象。須要注意的是:對象必定具體到某個個體,張三不必定是一個對象,由於能夠有不少個叫張三的,必定是「這一個張三」纔是一個對象。
定義語法:
[修飾符] class 類名{ //類的內容 }
如:
public class Person{ }
咱們定義了叫「Person」的一個類。
由於Java語言是區分大小寫的,因此須要注意關鍵字的大小寫的問題,類名能夠本身任意定義,建議起名要具備實際意義以及每一個單詞首字母大寫。
對於一個類而言,它包含三種最多見的成員:構造器、Field和方法。三個成員均可以定義0個或多個。
構造器是一個類建立對象的根本途徑,若是一個類沒有構造器,一般沒法建立對象,因此係統會爲每個類默認定義一個構造器,在不明肯定義的狀況下,它是隱藏的,若是明肯定義了,則不會默認定義。
定義構造器的語法:
[修飾符] 類名([形參 參數名]){
功能代碼
}
修飾符能夠是public private protected 或者不寫。
例:
public class Person{ public Person(){} }
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對象
對象建立完成。