1. 程式人生 > >初識java這個小姑娘(三)

初識java這個小姑娘(三)

試圖 ati rom 分享圖片 無緣 感激 ack 父類 無緣無故

說爛了的面向對象

我要說的面向對象,其實是一個我自己都覺的有點惡心的東西。

它是java語言入門如此初級的一個概念。作為一個老鳥,你可以吐口水給我,我可以把它們擦幹,但作為總結還得說一說。

因為對於一個從來沒有接觸過編程語言的人來說,就不那麽簡單了。任何一件簡單事情,只是因為你會了,而對於不會的人,就如上天一般的難。

當年作為資深小白的我第一次聽老師說起這個概念,臉上寫著大大的兩個字:"懵逼"。面向對象?對象?面對著對象,呆萌。。。好吧,這個對象和我想的對象是在不太一樣。因為老師告訴我,在java的世界裏,處處都是對象,如此和諧的一個世界。

而實際上,它只是java語言思考解決問題的一種方式。那就是對於一切要解決的問題,都被歸類成了兩個方面,是什麽,能幹什麽。是不是和哲學的三大終極問題有點相似:我是誰,我從哪裏來,我要去哪裏去。看似簡單,實際上也是對於這個世界的一種思考。

比如一輛汽車,首相要弄明白的是,什麽是汽車,怎樣的一個物體可以被稱為汽車,應該擁有哪些屬性?在java中被稱為屬性。而汽車有哪些行為?它能跑,喇叭會叫,能前進,能倒退等等這樣的行為被稱為方法

再比如公司。公司擁有哪些屬性?它在哪裏,有多少人,有多少男員工,有多少女員工等等。而公司能做什麽?可以經營,創收,交稅等等這麽多的行為。

如此再來理解一切皆為對象這句話。就是說萬事萬物,一切可以被看見,被感知的物體或者事情都可以抽象為對象這個東西,被語言所認可。而實際上,當我真正開始用對象這種思路來理解整個世界的時候,還挺可怕的。

接觸編程之前,我會以一個人的視角去思考問題。

比如說,從1,4,5,2,3這一串數字中找到最大的一個數,是不是很簡單?是啊,這不一眼就看出來了嘛?那只是因為你太年輕了。在一眼就看出來了的過程中,大腦經歷了怎樣的思考過程。我試著把這個瞬間放大十萬倍。首先,我看到了一串數字。這串數字其中的一部分被我記到。我試著從前兩個,或者前幾個中找到最大值,並且記住這個最大值。然後開始叠代,是否能找到一個更大的值然後替代之前最大的值。

是不是?對不對?放慢了時間,原來大腦也並不是一眼就看出來了其中的最大值。如果可以理解這個道理,那麽也就明白語言的思路不過是模擬大腦的思維方式而已。而也許所有的事物到了最最本質,都在遵循一樣的道理。就像是結繩記事一樣,我們只是在通過自己的方式來認識這個世界吧。

再說到面向對象,就要說到它的三個基本特征:封裝,繼承,多態。


第一個基本特征:封裝

其實封裝的概念早在我們試圖把所有的具體事物和問題都抽象為對象的那一刻就開始了。當java擁有了這麽多對象,就好像小孩子有了各種各樣的積木,這些對象之間就可以產生作用,互相配合來實現最後的目的。

而封裝對於java來說的做法,就是類(class)。所有的對象都被以類的方式展示給我們。下面給出java的一個類,參照上文中給出的例子。

public class Car{                                                                     

}

我們定義好了一個汽車類。其次要進一步描述,汽車擁有哪些屬性呢?

比如說汽車有長、寬、高和顏色。怎麽來描述呢?點像是畫畫,我不是在寫代碼,我是在畫畫,我們怎樣畫一個我們所認為的汽車?

public class Car{                                                                     
  int length;
  int width;
  int height;
}

畫好了它的基本屬性,那麽這個汽車能做什麽呢?汽車能向前開,向後倒。

public class Car{                                                         
  int length;
  int width;
  int height;                                                                                 

  public void goForward(){}
  public void goBackward(){}

}

如此已經畫好了一輛汽車。也就封裝好了一輛汽車,這輛汽車就是java世界裏的汽車,就好像在畫裏。

封裝隱藏了類的內部實現機制,可以在不影響使用的情況下改變類的內部結構,同時也保護了數據。對外界而已它的內部細節是隱藏的,暴露給外界的只是它的訪問方法。


第二個基本特征:繼承

封裝好的對象已經可以作為java中的一個基本單元來工作了。但是試想這麽一種情況,我現在又需要重新創建一個對象,卡車。

卡車作為汽車的一種,自然是擁有汽車類的所有的屬性和方法。(經過上面的介紹,應該對於屬性和方法這種說法並不陌生了)

那麽我是否應該重新創建一個類呢。比如:

public class Truck{                                                      
  int length;
  int width;
  int height;                                                                                       

  public void goForward(){}
  public void goBackward(){}
}

是不是有些累贅,這也就是繼承的作用。一個事物不會無緣無故被創造出來,存在就有其存在的意義。在java中當一個類繼承另外一個類的時候,被繼承的類成為父類,繼承者稱為子類。通過extends這個關鍵字來實現。代碼如下:

public class Truck extends Car{                                                                                     

}

這種寫法和上面直接定義Truck這個類的寫法效果是一樣的。卡車類已經擁有了關於汽車的公共屬性。那麽我們再來定義它所私有的方法。

比如說,卡車有載貨量這個屬性,卡車能夠拉貨:

public class Truck extends Car{
  int burden;   //載貨量                                                              
  public void pullThings(){}     //載貨
}

繼承大大的減小了重復代碼的書寫量,減輕了系統運行的負擔,同時又非常好維護,比如我們要給汽車再增加一個所有的汽車都擁有的共同屬性,那麽該怎麽辦?在使用繼承之後,我們只需要給父類Car增加即可,那麽所有的不管是卡車,還是小汽車,還是面包車都擁有了新增加的屬性。就不必在一個類一個類的去添加了。是不是很方便?繼承是為了重用父類代碼。兩個類若存在IS-A的關系就可以使用繼承。


第三個基本特征:多態

多態就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時並不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性。

比如你是一個酒神,對酒情有獨鐘。某日回家發現桌上有幾個杯子裏面都裝了白酒,從外面看我們是不可能知道這是些什麽酒,只有喝了之後才能夠猜出來是何種酒。你一喝,這是劍南春、再喝這是五糧液、再喝這是酒鬼酒….在這裏我們可以描述成如下:

酒 a = 劍南春

酒 b = 五糧液

酒 c = 酒鬼酒

這裏所表現的的就是多態。劍南春、五糧液、酒鬼酒都是酒的子類,我們只是通過酒這一個父類就能夠引用不同的子類,這就是多態:我們只有在運行的時候才會知道引用變量所指向的具體實例對象。

上一篇文章中有前輩給我提出了問題,在此感激不盡。

也感謝諸位能夠關註點贊。掃描識別下面的二維碼即可。

技術分享圖片

技術分享圖片

初識java這個小姑娘(三)