從語言方面出發:java
對於C語言來講,是徹底面向過程的。python
對於C++語言來講,是一半面向過程,一半是面向對象。(C++是半面向對象的)編程
對於Java語言來講,是徹底面向對象的。markdown
面向過程的開發方式主要的特色是:編程語言
注重步驟,注重的是實現這個功能的步驟。oop
第一步幹什麼學習
第二步幹什麼spa
....設計
另外面向過程也注重實現功能的因果關係。code
由於A全部B
由於B因此C
由於C因此D
.....
面向過程當中沒有對象的概念。只是實現這個功能的步驟以及因果關係。
面向過程最主要是每一步與每一步的因果關係,其中A步驟因果關係到B步驟,A和B聯合起來造成一個子模塊,子模塊和子模塊之間又由於因果關係結合在一塊兒,假設其中任何一個因果關係出現問題(錯誤),此時整個系統的運轉都會出現問題。(代碼和代碼之間的耦合度過高,擴展力太差。)
螺栓螺母擰在一塊兒:耦合度高嗎?
這是耦合度低的,由於螺栓螺母能夠再擰開。(它們之間是有接口的。)
螺栓螺母擰在一塊兒以後,再用焊條焊接在一塊兒,耦合度高嗎?
這個耦合度就很高了。耦合度就是黏連程度。
每每耦合度高的擴展力就差。
耦合度高致使擴展力差。(集成顯卡:計算機顯卡不是獨立的,是集成到主板上的)
耦合度低致使擴展力強。(燈泡和燈口關係,螺栓螺母關係)
這臺計算機將沒有任何一個部件,全部的都是融合在一塊兒的。
你的這臺計算機是一個實心兒的,沒有部件的。一體機。
假設這臺一體機的任何一個「部位」出問題,整個計算機就不能用了,
必須扔掉了。(沒有對象的概念。)
內存條是一個對象
主板是一個對象
CPU是一個對象
硬盤是一個對象
而後這些對象組裝在一塊兒,造成一臺計算機。
假設其中CPU壞了,咱們能夠將CPU拆下來,換一個新的。
對於小型項目(功能),採用面向過程的方式進行開發,效率較高。
不須要前期進行對象的提取,模型的創建,採用面向過程
方式能夠直接開始幹活。一上來直接寫代碼,編寫因果關係。
從而實現功能。
採用面向對象的方式進行開發,更符合人類的思惟方式。(面向對象成爲主流的緣由)
人類就是以「對象」的方式去認識世界的。
因此面向對象更容易讓咱們接受。
面向對象就是將現實世界分割成不一樣的單元,而後每個單元都實現成對象,而後給一個環境驅動一下,讓各個對象之間協做起來造成一個系統。
對象「張三」
對象「香菸」
對象「打火機」
對象「吸菸的場所」
而後將以上的4個對象組合在一塊兒,就能夠模擬一我的的抽菸場景。
其中「張三」對象能夠更換爲「李四」
其中「香菸」也能夠更換品牌。 其中「打火機」也能夠更換。
其中「吸菸的場所」也能夠更換。
採用面向對象的方式進行開發:
耦合度低,擴展力強。
找一個合適的案例。說明一下面向對象和麪向過程的區別?
蛋炒飯:
雞蛋和米飯徹底混合在一塊兒。沒有獨立對象的概念。
假設客戶提出新需求:我只想吃蛋炒飯中的米飯,怎麼辦?
客戶提出需求,軟件開發者必須知足這個需求,因而開始擴展,這個軟件的擴展是一場噩夢。(很難擴展,耦合度過高了。)
蓋飯:
老闆,來一份:魚香肉絲蓋飯
魚香肉絲是一道菜,能夠當作一個獨立的對象。
米飯能夠當作一個獨立的對象。
兩個對象準備好以後,只要有一個動做,叫作:「蓋」
這樣兩個對象就組合在一塊兒了。
假設客戶提出新需求:我不想吃魚香肉絲蓋飯,想吃西紅柿雞蛋蓋飯。
這個擴展就很輕鬆了。直接把「魚香肉絲」對象換成「西紅柿雞蛋」對象。
目前先聽一下,須要三四年的時候才能完全領悟面向對象。
面向過程主要關注的是:實現步驟以及整個過程。
面向對象主要關注的是:對象A,對象B,對象C,而後對象ABC組合,或者CBA組合.....
OOA:面向對象分析
OOD:面向對象設計
OOP:面向對象編程
整個軟件開發的過程,都是採用OO進行貫穿的。
實現一個軟件的過程:
分析(A) --> 設計(D) --> 編程(P)
在軟件公司當中,通常同事與同事之間聊天,有的時候會忽然說出來一個英語單詞。
這種狀況是很常見的。因此一些術語仍是要知道的,否則會鬧出笑話。
leader 領導/經理/組長
team 團隊
PM 項目經理(整個項目的監管人)Project Manager
封裝
繼承
多態
任何一個面向對象的編程語言都包括這三個特徵
例如:
python也有封裝 繼承 多態。
java也有封裝 繼承 多態。
注意:java只是面向對象編程語言中的一種。
除了java以外,還有其它不少不少的編程語言也是面向對象的。
以上三個特徵的名字先背會,後面一個一個進行學習。
面向對象當中最主要「一詞」是:對象。
類實際上在現實世界當中是不存在的,是一個抽象的概念。
是一個模板。是咱們人類大腦進行「思考、總結、抽象」的一個結果。(主要是由於人類的大腦不通常纔有了類的概念。)
類本質上是現實世界當中某些事物具備共同特徵,將這些共同特徵提取出來造成的概念就是一個「類」,「類」就是一個模板。
明星是一個類
對象是實際存在的個體。(真實存在的個體)
宋小寶就是一個對象
姚明就是一個對象
劉德華就是一個對象
....
宋小寶、姚明、劉德華這3個對象都屬於「明星」這個類。
在java語言中,要想獲得「對象」,必須先定義「類」,「對象」是經過「類」
這個模板創造出來的。
類就是一個模板:類中描述的是全部對象的「共同特徵信息」
對象就是經過類建立出的個體。
這幾個術語你須要本身可以闡述出來:
類:不存在的,人類大腦思考總結一個模板(這個模板當中描述了共同特徵。)
對象:實際存在的個體。
實例:對象還有另外一個名字叫作實例。
實例化:經過類這個模板建立對象的過程,叫作:實例化。
抽象:多個對象具備共同特徵,進行思考總結抽取共同特徵的過程。
類 --【實例化】--> 對象(實例)
對象 --【抽象】--> 類
類是一個模板,是描述共同特徵的一個模板,那麼共同特徵包括什麼呢?
潘長江對象:
名字:潘長江
身高:165cm
打籃球:非專業的,本身玩兒呢,無所謂了
學習:考試80分
姚明對象:
名字:姚明
身高:240cm
打籃球:NBA專業球員,打籃球很是棒
學習:考試100分
共同特徵包括哪些?
名字、身高都屬於名詞(狀態特徵)
打籃球、學習都屬於動詞(動做特徵)
類 = 屬性 + 方法
屬性來源於:狀態
方法來源於:動做
public class 明星類{
//屬性-->狀態,多見於名詞
名字屬性;
身高屬性;
//方法-->動做,多見於動詞
打籃球方法(){
}
學習方法(){
}
}
複製代碼
陳賡同窗、何偉彬同窗,他們倆有沒有共同特徵呢?
有共同特徵,就能夠抽象一個類模板出來。
能夠定義一個學生類(Student)
public class Student {
// 屬性
// 姓名
// 性別
// 身高
// 方法
public .... sing(){
}
public .... dance(){
}
public .... study(){
}
.... }
咱們爲何要作軟件開發?
說的大一些是爲了人民服務。解決現實生活當中的問題。
軟件開發既然是爲了解決現實世界當中的問題,那麼首先java軟件必須可以模擬現實世界。
其實軟件是一個虛擬的世界。
這個虛擬的世界須要和現實世界一一對應,這才叫模擬。
[修飾符列表] class 類名 {
//類體 = 屬性 + 方法
// 屬性在代碼上以「變量」的形式存在(描述狀態)
// 方法描述動做/行爲
}
複製代碼
注意:修飾符列表能夠省略。
假設咱們要描述一個學生:
學生包括哪些屬性:
學號: 110
姓名:"張三"
性別:'男' (true/false)
住址:"深圳寶安區"
答案:是由於屬性對應的是「數據」,數據在程序中只能放到變量中。
結論:屬性其實就是變量。
變量的分類還記得嗎?
變量根據出現位置進行劃分:
方法體當中聲明的變量:局部變量。
方法體外聲明的變量:成員變量。(這裏的成員變量就是「屬性」)
6.三、請你們觀察「學生對象1」和「學生對象2」的共同特徵,而後再利用java語言將該「學生類」表述/表達出來。(這裏只表達屬性,不表達方法.)
按說應該先編譯XueSheng.java,而後再編譯XueShengTest.java
可是對於編譯器來講,編譯XueShengTest.java文件的時候,會自動找XueSheng.class,若是沒有,會自動編譯XueSheng.java文件,生成XueSheng.class文件。
javac XueSheng.java
javac XueShengTest.java
javac XueShengTest.java
Javac *.java
類名 變量名 = new 類名();
這樣就完成了對象的建立。
對象又被稱爲實例。
實例變量實際上就是:對象級別的變量。
public class 明星類{
double height;
}
複製代碼
身高這個屬性全部的明星對象都有,可是每個對象都有「本身的身高值」。
假設建立10個明星對象,height變量應該有10份。
因此這種變量被稱爲對象級別的變量。屬於實例變量。
實例變量在訪問的時候,是否是必須先建立對象?
對象是經過new出來的,在堆內存中存儲。
引用是:但凡是變量,而且該變量中保存了內存地址指向了堆內存當中的對象的。