學習目標:
① 結構化編程和物件導向的區別
② Java物件導向思想
③ 物件導向的基本特徵
物件導向是Java的核心思想,既然想弄清楚核心思想,深入貫徹物件導向思想是沒有那麼簡單的,所以在這個重中之重的物件導向上,準備分好幾篇來學習,第一篇是瞭解物件導向,慢慢學習.
當前有兩種主流的開發方式,一種是結構化開發,一種是物件導向開發.由於物件導向開發中的方法採用的是結構化編程,所以在此還是想先介紹下什麼是結構化開發.
結構化開發是面向功能的.它是以系統軟體的功能為驅動的,因此她的最小程式單元是函數,其中以主函數作為程式的入口函數,再調用其他普通函數,包括普通函數之間的調用,從而完成系統的相關功能.如下圖:
結構化開發是面向資料流的.每一個函數都包括輸入,輸出和函數體,函數體是對傳入的資料進行處理,並且輸出一些資料,所以結構化編程也是面向資料流的.
那麼結構化開發的步驟有哪些?
首先SA(Structured Analysis)結構化分析是對系統進行需求分析,然後根據需求分析對系統採用SD(Structured Design)結構化設計,包括對系統概要設計,詳細設計,之後採用SP(Structured Program)進行結構化編程來實現系統.
由上圖可以看出來,結構化開發思想採用的是自上而下的設計方式,這種開發思想不難想到,它需要在軟體開發設計前期,就需要對軟體進行功能模組的劃分,每一個功能模組需要細分為更小的模組,再將模組細分直至細化成了一個個函數,所以這種開發思想可以比較好的保證開發產品的品質和進度,但相比於這個,其局限性更加讓人頭痛:
局限性:
在產品伊始,無法確定產品的所有需求,其擴充性差.
結構化開發方式不符合人類的思維習慣,在開發過程中需要將客觀世界抽象出來在細分為模組和功能(在此要注意抽象並不是物件導向的特徵,所有的程式設計語言都要講客觀世界抽象出來).
結構化編程必須包含的三種結構,順序結構,選擇結構和迴圈結構.
(在此多說一句,學習方法問題,個人覺得採用樹形擴散的方式會學的更加廣一些,例如在此處講到了選擇結構的switch語句,那麼我們可以順著聯想他的注意事項,使用方式等等)選擇結構無非是if\else語句和switch語句,在switch語句中需要注意switch支援類型問題,case穿透的問題和default的位置問題:
① switch支援的資料類型
switch支援能隱式轉換成int型的基礎資料型別 (Elementary Data Type)(byte\short\char\int)和枚舉以及String的引用資料類型
② case穿透
所謂case穿透就是不再判斷case是否符合條件而直接運行case的內容,直至其遇到break或者}結束
例如
@Test
public void tets08(){
int i = 2;
switch (i) {
default:
System.out.println("d");
case 1:
System.out.println("1");
case 2:
System.out.println("2");
case 3:
System.out.println("3");
}
輸出的結果是2和3;
③ default
default的位置預設是在末尾,但它可以在switch的任何位置,當它在所有case之前的位置時,當運行了switch之後,它是跳過default語句,先對case語句進行條件判斷,如果條件符合了,則不對default的語句進行執行,當case條件都不滿足的時候,再跳到default進行執行,如果default未加break;同樣會造成case穿透.
在學習物件導向的具體特徵之前,應該先貫徹一個物件導向的思想,那麼究竟什麼是物件導向的思想呢?
Java物件導向的思想
在此之前我們需要告訴自己一個原則,一切都是對象.
一切事物都是對象
Java中出了8中基礎資料型別 (Elementary Data Type)外,其他的一切都是對象.對象具有狀態,我們用成員變數來表示,對象有行為,我們用方法來表示.由此就組成了類,Java對象是Java的核心,所以對象具有唯一標識性,當對象失去標識的時候就是被GC回收的時候.
前面我們知道了結構化開發的思想最小程式單元是函數,而物件導向的最小程式單元就是類.因此物件導向的編程粒度比結構化開發的粒度要大,並且物件導向的思想更加符合人類的思維方式.例如我們需要表達人洗頭髮這一件事,在結構化編程來看錶達應當是
洗(人,頭髮);
而物件導向看了則是
人.洗(頭髮);
物件導向的三大基本特徵
封裝encapsulation
封裝是將對象的具體實現細節隱藏起來,而通過公有的方法將其功能展示出來,就如同一個店家將其秘方儲存起來,但是他可以將做出來的東西賣給你.
繼承
繼承是為了增加代碼的複用,當子類繼承了父類之後,子類就變成了一個特殊的父類,子類將擁有父類的所有成員變數和方法.
多態
多態是建立在繼承的基礎之上的,用super向父類傳遞不同的資料,可以實現同一類型的對象在執行同一個方法適合,表現出多種行為.
封裝繼承和多態作為三大基本特徵,需要學習的有很多,所以在物件導向的原理淺析系列中會慢慢介紹.