Android探索之旅 | 物件導向和Java基礎

程式設計師聯盟發表於2019-02-18

Android探索之旅 | 物件導向和Java基礎

-- 作者 謝恩銘 轉載請註明出處

上一篇 Android探索之旅 | Android簡介 中說到:

"Android的預設開發語言是Java,入門簡單。而且,你的Java水平不需要多好就可以上手開發Android App了。"

不少朋友說看到後很是心安。

不過小編也不想誤導大家: 你的Java和麵向物件水平當然是越高越好啦, 也要學學設計模式, 這樣才能設計出可複用,可擴充套件,可維護的優秀程式。

如果你是Java高手,那麼上手Android很容易。如果你是新手或者完全沒接觸過Java, 也不要驚慌, 只要你有一些基本的程式設計知識和麵向物件的概念即可。

比如, 你之前學習過C#, PHP, Ruby, Python, C++等物件導向的程式語言,那麼你上手Android不會有什麼大障礙。

其實, 現如今App開發已經很容易上手。你說現在Android的官方IDE: Android Studio(下一課我們配置開發環境會講到), 蘋果的iOS開發官方IDE : xCode。都已經做得很好很簡便了: 程式碼提示,自動補全,錯誤提示,修改提示, 等等, 簡直是夫復何求!

所以現在做App已經簡單得不能再簡單了,拉起來直接做唄。你不實踐永遠入不了門, 如果一直在那邊問: 我不怎麼懂Java能不能做Android開發啊? 那你止步不前, 怪誰呢? 必須踏出信心的第一步。

小編以前有段時間業餘做過遊戲開發,主要用Unity 3D, 也接觸過Cocos2D-X。 以前從來沒開發過3D或2D遊戲, Unity 3D裡面的所用的語言C#或Javascript也不是那麼精通,但很快就能做不少小遊戲出來。

如果你完全沒有程式設計基礎, 那麼最好先了解一下程式設計, 不過也不是說就不能上手Android了, 只是入門稍微累一些。但也不要怕, 你可以的。有問題可以問啊。

Java基礎


我覺得Java語言已經設計得很容易上手了, 如果你連C語言和C++都能駕馭, 那Java相對來說實在比較親民。

  1. 識別符號命名規範

  2. Java資料型別

  3. 運算子

  4. 分支語句(if,switch)

  5. 迴圈語句(for,while)

  6. 函式的定義

等等

這些基礎, 只要是個程式設計師,都懂。 語言之間可以融會貫通。

其他的知識點, 要用到時再去Google搜唄。

物件導向基礎


Android採用物件導向的程式設計技術。 因此我們學習一下物件導向的基礎知識, 之後我們還是會花時間細說的。

"物件導向程式設計"(OOP: Object-Oriented Programming) 。這是一種不同於以往的程式設計模式。

英語Object是"物件"的意思, 聽到這個詞, 少年你又激動了對吧? 我說的可不是找物件...

物件導向程式設計的模式不會立即使你的程式發生革命性的改變,而且剛開始接觸的時候你甚至會覺得這種模式沒什麼用。

目前為止我們的程式設計模式一直是:程式導向(POP : Procedure-Oriented Programming)。

也就是:我想要實現什麼功能,就寫什麼函式,宣告相應變數,等等。比如我要顯示一段資訊到螢幕上,我可以建立一個函式:

void showMessage(string message);複製程式碼

如果你接觸過C語言,那麼應該知道C語言是程式導向程式設計模式。當然了, C語言也可以實現物件導向程式設計的,只不過本身沒有內嵌的實現而已, 你可以用struct(結構體)來模仿class(類),但是比較麻煩。

相信我:慢慢地,你會發現物件導向的程式設計模式比程式導向更符合人類的思維。你將能更好地組織你的程式碼。

聽到物件導向程式設計,你最好奇的詞應該是"物件"吧。

你會想:這不會是又一種神祕的設計吧?難道是一個宿醉後的瘋狂程式設計師想出來的東西?

其實不然。我們身邊充滿著物件:你的車是一個物件,你的電腦是一個物件,你的手機是一個物件,你的房子是一個物件, 你的物件也是一個物件,等等。

事實上,我們所知道的所有東西都可以被看作物件。物件導向程式設計,就是在程式碼中操作這些被稱為"物件"的元素。

下面列舉幾種平時我們在程式設計中常見的物件:

  • 一個窗體:例如QQ的一個聊天對話方塊,畫圖軟體的主介面。

  • 一個按鈕:比如安裝軟體時那些"下一步"的按鈕。

  • 遊戲裡的一個人物。比如Warcreft裡的伊利丹。

  • 一首歌,一個視訊, 等等

說了這麼多,物件到底是啥呀?是一種新的變數嗎,還是一種新的函式型別?

no, no, no,都不是。物件是一種新的程式設計元素!

或者說得更具體一些,物件裡面混合了變數和函式。

可不要被這句話嚇跑了,我們一點點來探索。

想象一下... 一個物件。 嗯, 不是讓你想象美女...

還是來點實際的圖片好了,能幫助我們理解。

設想


有一天,一個程式設計師決定要寫一個圖形介面的程式,這個程式可以在螢幕上顯示窗體,調整窗體大小,移動窗體,刪除窗體,在窗體裡可以畫各種圖形,等等。

要實現這些功能,程式碼是比較複雜的:需要不少函式,這些函式之間互相呼叫。而且還需要很多變數,例如窗體位置(x座標和y座標),窗體的寬,高,等等。

這個程式設計師花了不少的時間來寫這個程式。程式有點複雜,但是他完成了。最終,他實現的程式碼包含了很多的函式和變數。

當我們第一次看到他的程式時,就好像看一個化學家的一個實驗環境一樣,啥也看不懂。如下圖:

Android探索之旅 | 物件導向和Java基礎

不過,這個程式設計師對自己的程式還是很滿意的,他甚至要把程式釋出到網上,讓大家可以用他的程式來建立窗體,直接拿來用就可以了,而不需要從零開始寫程式碼。

不過,有一個問題,如果你不是化學專家,你可能得花不少時間搞懂這一堆東西到底是怎麼運作的:哪一個函式最先被呼叫呢?為了改變窗體的大小,哪個變數要被傳遞到哪個函式裡呢?總之,我們很害怕把整個實驗環境給弄炸了。

在接到一些使用者的建議和抱怨後,這個程式設計師決定替使用者著想。他重新設計了他的程式碼,從程式導向的模式改為物件導向的模式。

這就好比他把所有和這個化學實驗有關的東西都放到一個大方盒子裡。這個大方盒子就是我們所說的"物件"。如下圖:

Android探索之旅 | 物件導向和Java基礎

在上圖中,大方盒子的一部分被設為透明,是故意的,使你可以看到裡面的景象。是的,我們的化學實驗的所有裝置都在大方盒子裡。

但是,實際當中,大方盒子是完全不透明的,使用者從外面看不到裡面到底有什麼。如下圖:

Android探索之旅 | 物件導向和Java基礎

這個大方盒子裡存放著函式和變數(那些化學儀器,試管,燒杯,等等),但這些元素對於使用者卻是不可見的。

這樣,使用者看到的就不再是成堆的試管,燒杯,等等讓其抓狂的東西了。

在大方盒子外面,我們呈現給使用者的就只有一些按鈕:一個按鈕用於"開啟窗體",一個按鈕用於"改變窗體大小",一個按鈕用於"關閉窗體",等等。使用者完全不需要理解大方盒子裡面的運作原理。

因此,以物件導向的模式來程式設計,就是:

程式設計師編寫程式碼(可能很複雜),然後將這些複雜的程式碼都裝到一個大方盒子(物件)裡,使用者從外面不能看到裡面的實現細節。
因此,對於使用這個物件的使用者來說,操作起來就容易多了:只需按下對應的按鈕,不需要精通化學也可以使用整個實驗環境提供的功能了。

當然了,上面的比喻只是一個大致概念。


你會問:我們學的不是物件導向嗎?為什麼無端跑出一個"類"來?

類是什麼呀?類和物件之間又有什麼"不可告人"的關係呢?

呃... 為了建立一個物件,必須先建立類!

解釋如下:比如我們要造房子,總得先有設計圖紙對吧?這樣,類就好比房子的設計圖紙,而物件就是根據圖紙建造出來的房子。

因此,建立一個類,其實就是畫出物件的設計圖紙。

只要有了房子的設計圖,你就可以依據這張設計圖造無數多個房子。類和物件也是這樣:一旦你把類設計好了,你就可以依據這個類來建立無數多個物件。如下圖所示:

Android探索之旅 | 物件導向和Java基礎

術語:我們說物件是類的例項("例項"在英語中是instance),這在物件導向程式設計領域經常聽到。這表明物件是類的具體的物化(房子也是房屋的設計圖紙的具體物化)。

你會說:這有點抽象吧。那好,我們就來建立一個類看看。

建立一個類,但是建立什麼類呢?

首先必須選擇一個類來建立。還是以建築為例,我們可以建立一座公寓,一個帶游泳池的別墅,一間閣樓。

選擇是很多樣的。當我們剛開始學習物件導向程式設計的時候,我們會有點卻步不前,不確定哪些東西可以被看作物件。

但答案卻是:幾乎所有東西都可以被認為是物件。

舉個例項


為了幫助你瞭解物件和其內容,讓我們用一個簡單的比喻開始。

假設你開車,你要踩加速踏板來使車子加速。

那麼,在你可以開車前,得有人來設計製造你的車。

要製造一輛車, 需要先有工程圖紙上的設計,類似於之前描述房子的設計藍圖。

這些設計圖中包括了加速踏板的設計。

對於駕駛員來說, 踏板有加速的作用, 但是他並不瞭解其中原理。就好比他也不瞭解為什麼方向盤可以改變車子的方向。這些都被隱藏了起來。這使得人們只需要會開車就可以, 而並不需要每個人都去研究汽車的底層原理。

類和方法


類就是這個汽車的設計圖紙。

一輛汽車有很多種能耐/能力, 例如可以行駛, 加速, 換方向, 剎車, 等等。

之前我們說的駕駛員踩加速踏板使其加速, 就是使用了汽車的其中一個能力。

在物件導向中, 我們把類中執行特定任務的區塊稱為 方法, 其實就類似程式導向程式設計中所說的函式。

類的方法向使用者隱藏了其具體實現,就像汽車的油門踏板可以控制汽車加速, 但駕駛員不知道其原理一樣。

例項化


正如你不能去開一張車的設計圖紙, 也不能在一個廚房的設計圖紙上做菜一樣。

我們的類(設計圖紙)需要被例項化才能被使用, 就好比車子必須依據設計圖紙被工廠製造出來才能被我們使用。

從類例項化出來可供使用的東西就是: 物件。

重用


就像汽車的設計圖紙,可被多次重複使用來構建多輛汽車。 你也可以重複使用類來構造許多物件。

類的可重複使用性是物件導向程式設計的一個很重要的優勢。

訊息和方法呼叫


當你開車時,踩下加速踏板, 實際上是傳送了一個指令給車子, 車子接收到指令就會加速。

類似地,你將訊息傳送給一個物件, 每個訊息就是一個方法呼叫,告訴物件中的方法來執行其任務。

屬性


一輛汽車,除了具有能力(方法)來完成任務,也有屬性。

比如車的顏色,車門的數目,油罐的儲油量,當前行駛速度和里程錶讀數。類似程式導向程式設計中的變數。

和汽車的能力(方法)類似, 汽車的屬性也是其工程圖設計的一部分。當你駕駛一輛實際的汽車,這些屬性與汽車是緊密聯絡的。每輛汽車有自己的屬性。

封裝


類裡面"封裝"了屬性和方法,屬性和方法是密切相關的。

不同類的物件可以彼此進行通訊,但它們通常不被允許知道其他物件的實現細節。

物件對外隱藏了這些細節, 這就是封裝的基本概念, 也是物件導向的一個關鍵。

繼承


一個類可以通過繼承別的類來快速獲取別的類的屬性和方法。

之後, 在繼承而來的基礎上, 還可以自定義屬於自己的屬性和類。

用我們的汽車來類比,普通車的車頂不能被開啟, 但是敞篷車可以。

敞篷車就是從最基礎的車這個類繼承了所有車的一般屬性和方法, 再自己加入了可以開啟車頂的方法。

總結


當然了, 這些概念還需要我們之後實戰來慢慢消化。慢慢來學習吧~


人世間,
萬千情感皆有溫度,
千萬程式碼似有性格。
這裡有原創教程,IT叢林......
和你一起探索程式人生。
微信公眾號「程式設計師聯盟」ProgrammerLeague
我是謝恩銘,在巴黎奮鬥的嵌入式軟體工程師。
個人簡介
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:“向著標杆直跑”

相關文章