# 物件導向 1 - 學習J筆記
學習 JAVA 的路上,可能最需要懂得就是這些基本觀念
預計下個學期在學校修課,但覺得自己可能還是先來看一下比較好
大四了,總覺得該把時間花在對的事情上,包括鞏固自己的學習方法、了解自己的目標跟方向、扎實地紀錄自己走過的路,希望往後的日自我能夠持續努力下去
## 物件導向程式設計概念
物件導向顧名思義就是利用軟體模擬現實生活中的實體,這些實體在物件導向程式當中就是物件,每個**物件**可以有自己的"屬性"以及"方法"
而物件導向的程式就是透過物件的方法產生互動,完成程式的目標
物件導向程式中具有四大概念:**class**(類別)、**object**(物件)、**method**(方法)、**property**(屬性)
類:人可以看作一個類。
物件:具體到什麼人(黃種人,白種人,黑種人,中國人等等)這就可以看作是物件,可以根據需求繼續往下區分,比如 男人 女人。
屬性:比如說黃種人的特點:黃面板,黑頭髮,黑眼睛等等,這些就是黃種人具有的屬性,本身存在的,也可以是後天加上去的,是不需要人刻意去行動,自然而然表現出來的。
方法:方法其實是某種人的具體行為解釋,比如說會走路,會說話
以及三大特性:封裝、繼承(extend)、多型
## 程式設計概念
>在純物件導向的程式中,每一個運作實體都可視為某種類別衍生出來的物件
* 類別具有較為抽象的概念,他會是某些具有共同特性物件的集合
* 換句話說,物件則代表了類別的實體
* 原則上每個物件相互獨立且無關聯性
>物件之間的互動是透過訊息(Message)的傳遞來達成
* 發送訊息的物件稱之為發送者(sender)
* 接受訊息的物件稱之為接收者(receiver)
* 當物件需要其他物件服務時,會發送訊息給接收者,接收者在收到訊息後,會執行符合要求的方法完成任務以提供服務。
* 由於每一個物件都是一個獨立的個體,因此改良某一物件的內容時,其他不同類別的物件並不需要跟隨著變動。
---
### 物件(object)
>真實世界的所有不論具體或抽象事物,都可以視為是一個物件
我們可以想像飛機、狗、鬼魂、螺絲釘、地球,這些東西都可以成為物件
想當然耳,這些物件都可以被拆分成更小的物件,像是飛機可以被拆分為機翼、輪胎、機身、座椅...等等。
>在程式設計當中,單一物件應該要是一個完整單元,然而物件也應該要可以組合成為更大的物件。
例如一個按鈕、一個空格是單一且完整獨立的物件單元,但是多個按鈕加上多個空格就可組成一個可回覆式表單,可回覆式表單也會是一個單一且完整的物件單元。
#### 屬性(property)
>物件擁有許多特性(attribute),這些特性代表了一個物件的外觀或某些性質
一輛汽車(物件)可能有不同的顏色、型號,而這些特性就是物件的"屬性"
然而,在我們取得"物件的屬性"時,也可能是去取得另外一個"物件"。
汽車的引擎可以是汽車的屬性可能叫做"動力來源",但他也是汽車的一個子物件;或是汽車的引擎廠牌,也可以是引擎本身的子物件。這些物件,也會存在自己的方法
>在程式設計或執行階段,我們可以藉由改變屬性來改變整個物件的某些特性,完成我們想要的物件表示形式。
將汽車烤漆為藍色,椅墊要是牛皮的...等等
>在 Java 語言中,屬性(Property)被稱為 Field(有人翻譯為欄位;有時也翻譯為成員資料變數),並且被區分為不同的等級
* 某些等級的屬性,不允許外部的程式對他們加以修改,必須透過該物件的方法,才能夠達到修改的目的
* 因此透過物件去附帶屬性,有保護資料的功能
#### 方法(method)
>每個物件都擁有不同數量的行為,這些行為在物件導向程式設計中稱之為方法。**不同種類的物件所擁有的方法大多不同,但同類物件擁有的方法則大致相同。**
同為飛行器的飛機和直升機,兩個雖然是"不同的物件",但是關於基本的方法應該都會包含"飛行"這個方法
>所謂方法,也就是為了完成該物件某些目標的處理方式
>每個方法都會有許多細節
如何達成起飛、降落、前進、後退這些方法都有各自的細節
>在 Java 中,方法也稱之為 method(有些書籍翻譯為方法或函式,也就是成員函式)。
* 同時 Java 的 method 也和 Field 一樣,被區分為多種等級
* 某些等級的成員函式同樣不允許外部程式呼叫執行(只能做為內部成員函式呼叫執行的對象)
* 因此達到封裝物件的功能
>對於某些由他人完成的物件而言,該物件同樣必須提供許多關於物件的方法,如此一來,我們就不需要了解這些方法的細節,而能夠快速運用物件來完成工作
我們買了一台飛機,我只要會"操作"飛機,不需要了解飛機如何起飛、燃料如何供應,就能夠達到最低限度的使用
---
### 類別(Class)
>物件雖然是獨立的個體,不同的物件可以擁有相同的屬性及方法,例如:「一架民航機」和「一架戰鬥機」各是一個物件,但兩者的速度、爬升力、重量、載重量雖不相同,但卻同樣擁有這些屬性以便表達完整物件的各個特性。所以,不同的物件若擁有共同的屬性,但因為屬性內容的不同,因此可以創造出同類性質但卻獨立的不同物件。而同類型的物件,則構成了類別(Class)
例如每一個按鈕都是一個物件,屬於按鈕類別之下所建造出來的物件實體,但是由於按鈕的名稱不同,因此視為不同且獨立的物件
>更明確地說,類別才是物件導向程式設計最基本的單元
「民航機」和「戰鬥機」都是物件,而『飛行器』或『飛機』才是類別。不同的只是在建立該類別的實體物件時,給予不同的屬性而已。
>事實上,在 Java 這樣的物件導向程式語言中,我們必須先定義類別,然後才能夠透過類別宣告各個屬於該類別下的物件,接著再設定物件的屬性來代表該物件某方面的特性,並使用物件的方法來操作物件
### 小結
* 從由下而上的角度來看,類別是許多同類物件的集合
* 所謂同類物件,代表擁有相同屬性(變數)、相同方法(函式)的物件集合
* 在純物件導向的程式中程式碼是以類別為基礎,而物件只是類別的實體
比如說 String 這個類別,可以讓我們宣告一個 String 物件
```java=
String MyName;
```
但是這個 String 物件被宣告之後只有物件名稱,只有一個參考,沒有實體,因此實體的物件還是要透過new這個動作去產生。
```java=
String MyName = new String("Jeff");
```
如此一來才是完整的宣告了一個包含我自己名字在內的 MyName 物件
而這個物件是一個屬於 String 類別的物件,也就是說它包含了所有 String 類別、物件的屬性和方法。
對於程式來說,物件名稱是一個參考,利用參考指向物件實體,才可以形成對物件的影響。
在之後的筆記終將會個別介紹 JAVA 的類別、物件以及方法
2020/12/30
###### reference
[某處上課PPT](http://dns2.asia.edu.tw/~wzyang/slides/java/chen/se7ch07.pdf)
[Java基礎總結(一)](https://www.itread01.com/content/1546524374.html)
###### tags: `JAVA` `學習計畫` `物件導向`