創作內容

2 GP

物件導向 (物件與類別)

作者:播磨拳兒│2020-10-27 23:15:23│巴幣:4│人氣:341
這裡開始就是一到分水嶺啦

我還在蹲補習班的時候

這堂課後面一堂通常睡的睡, 倒的倒

但是他又是Java的核心, 一定要了解的

物件導向的三大主題 封裝 繼承 多型

但在講這三大主題前, 要先從最基本的物件與類別先了解起

======================分隔線======================
什麼是物件? 什麼是類別??

很多網站上或是教學書籍影片都會說

任何你想得到的實體物體都可以叫做物件

車子啦, 房子啦, 人類啊.....等等等

我個人覺得這樣說有點攏統

我把範圍再稍微縮小一點

錢:
(照片是我個人的得意收藏~~炫耀一下而已)

說到錢, 你要如何定義錢?

隨便舉例: 面額 國別 鑄造年份 是否流通

換作程式表示

面額 (int) 國別 (String) 鑄造年份 (Int) 是否流通 (Boolean)

如果是照片中的這些硬幣, 就是我們說的『物件』

套用我們剛剛隨便舉例的定義

10元 (一部份的收藏而已)

面額: 10 國別: 台灣 鑄造年份:*@$#%% 是否流通: 是

50元

面額: 50 國別: 台灣 鑄造年份: 左邊1993 右邊 1997 是否流通: 否

乾隆★寶 (別問我怎麼入手的.....)

面額: ..... 國別: 康熙乾隆.... 鑄造年份: 雍正13年.....(西元1735年) 是否流通: 當然否啊.....

以上的硬幣, 在程式裡面可以如何呈現?

首先: 我們要先定義『錢』

而錢就是我們說的『類別 class』

======================Class 類別======================
大陸稱為『類』.......(為何要提到大陸稱呼, 因為未來你查資料會很常看到.....)

人類是個類別: 而木村拓哉是人類, 所以我們可以說木村拓哉是人類的『物件 Object』

同理, 錢也可以算是一種類別

而硬幣就是錢所產生的物件

類別的說法比較像是『統稱』

雖然有些教材上會說類別就像是一個範本

我覺得這個說法不太好理解

用『統稱』來說會比較好一點

硬幣, 紙鈔 => 統稱『錢』
木村拓哉, 馮迪索 => 統稱『人類』
漫畫書, 旅遊書 => 統稱『書』
賓士, 法拉利 => 統稱『車子』

所以 類別就是這些物件的統稱

當然, 這些統稱可能還有更上一層的統稱

這就是物件導向的核心之一 『繼承

不過我們先不提繼承 先專心在物件和類別上

類別在程式裡面能幹什麼? 事情可多啦

除了定義物件的長相, 甚至是定義行為

更簡單的說法: 可以把多個變數組成一個群組

簡單想像一下

你現在要跟別人要一些基本資料

我要你的姓名, 出生年月日, 身分證字號, 父母親姓名, 配偶名, 戶籍地址

所以你要跟你的使用者要資料的時候, 你真的要一個一個傳?

何不把它寫成一個叫『身分證』的類別呢?

首先, 先建立一個class


接著跳出這個熟悉的畫面


類別名稱記得大寫開頭
類別名稱記得大寫開頭
類別名稱記得大寫開頭

雖然是老生常談, 後面一點你就會有感覺了....

輸入完就按『Finish』

雖然親手打也可以

類別的基本架構長這樣

*註1

class是前綴字, 表示他是類別

這樣我們就有兩個Class啦(Main 和 IdCard)

接著就要開始定義屬性


基本上要不要給他值, 看你對這個類別怎麼定義

一般來說都是要把它生成『物件』的時候才會給他數值

就像你說你要組一台電腦

當然也可以買現成的, 對吧 別人幫你組好好

但是你想要特製的規格, 也就是你要自定義屬性 怎麼辦?

既然類別寫好了, 差不多該來說說如何使用類別了

======================Object 物件======================
前面說到

類別就是寫『統稱』

我寫一個人類的統稱, 我要如何生成一個人類叫木村拓哉?
我寫一個身分證的統稱, 我要如何生成一個木村拓哉的身分證?

從類別生成出來的東西就叫做『物件』

而生成的方式就是透過『new』出來, 也有另外一種說法叫『實體化』

所以有些人會說『XXX的實體』

就像是說『身分證的實體』

指的就是身分證的物件啦

咱們回到Main裡面, 把身分證的物件new出來吧


雖然說new出身分證了, 但是這張身分證還是一片空白啊

他沒有名字, 沒有身分證字號, 沒有生日日期, 沒有父母名字, 沒有配偶

因為你還沒有給他屬性

前面在介紹類別的時候不是有說『可以給他值』嗎?

如果你在類別裡面寫了


也就是說, IdCard這個類別已經完完全全是木村拓哉的形狀了= =....

為什麼勒? 我們把它印出來看


完全就是木村拓哉的身分證啊.....

那是因為你已經在類別裡面寫死了

那我可以不要寫死嗎? 當然可以

首先, 我們先回到剛定義好身分證的時候


接著我們需要呼叫他的『建構式 Constructor』

建構式你可以想成他是初始化這個物件的產生器

也就像是新遊戲創建角色的概念啦

我們先回IdCard類別裡面, 在定義好屬性的時候



接著會跳出這個畫面


這個建構式就是定義你要生成這個物件時需要哪些屬性

我們先把全部都打勾, 後面我再給你做比較你就知道啦

確定就按下Generate

*註3

有沒有看到它生出什麼程式碼?

這就是『建構式Constructor』

這個Constructor一定會是類別的名稱

且不會有回傳值

所以一般會寫作這樣

*註1

就像我前面說的

建構式就像是遊戲創新角色一樣

你可以給他初始值, 可以不給

所以Constructor也可以寫成這樣


這是所謂的預設類型

也就是說, 我們在new出物件的時候

可以不用給他值

如果你沒有寫空的Constructor

在你new出物件的時候, 編譯器會強制要你給他值, 不然無法初始化

這個概念就像是遊戲開始, 你要初始化你的角色


數值你可以愛給不給隨便你

你可以不需要給名字, 不給性別, 不給年齡

那就是開一個預設的空的Constructor

反正不給, 我也一樣可以生出這個角色(物件)

所以, 一個類別如果定義兩個以上的Constructor

生出這個物件的方式就可以不只一種


回到身分證

有了Constructor之後, 我們就可以生成物件啦

這張照片中的kimuraCard就是new出來的『木村卡』

也就是身分證(class)的物件

而從kimuraCard上面出來的name就是我們定義在IdCard裡面的那個name


而這個順序的排列就是根據我們的第二個Constructor來的

所以說, 我們也可以用第一個Constructor寫一個馮迪索的身分證


所以印出來就會是


馮迪索的身分證我就是用第一種建構式寫出來的

因為他沒有指定要給哪個值

所以假設我們沒有給馮迪索的身分證上面寫配偶名


但是這件事情會發生在木村拓哉的身分證上面嗎?

答案是不可能

為什麼?

因為木村拓哉的身分證是用第二種Constructor寫的

而第二種Constructor是有要求給值的

所以如果你少給了配偶名或是任何其中一項


編譯前就會噴錯

那你會說: 我們就固定寫第二種Constructor就好啦

其實寫哪一種並沒有一定的標準答案

因為程式的使用狀況太多種

有可能你會像馮迪索的身分證一樣事後才給值

或是木村的老婆突然跑了, 你必須要刪去掉木村拓哉的身分證的配偶名

*註2

======================物件的使用======================
宣告的方式


或是


全看你用哪一種Constructor

其實上面的例子當中就可以看到我是如何使用了

你也可以宣告一個變數去接他


kimuraCard 和 dieselCard兩個物件各自點得出他們的『屬性』

而這個屬性就是被定義在IdCard這個類別裡面

所以木村卡和迪索卡兩個物件都擁有名字, 出生日期, 身分證字號, 父母名, 配偶名 這些屬性

如果你的物件是採用迪索卡的Constructor寫法, 事後才給值

使用的時候會有很大的機率噴null

所以在使用前就要自己加以判斷是否為null了

==============================

註1: 為何我的class前面有個字『public』
這個東西是一個公開級別
雖然沒有要在這一篇裡面解釋, 點到為止
簡單說, 越公開 資料被竄改的機會就越大
沒有寫, 預設的公開程度也快跟完全公開的public沒兩樣
這部分會牽扯到物件導向的三大核心之一『封裝
之後的教學裡面會再更詳細的說明

註2: 『null』和『 』
在程式裡面, 你要如何表達『沒有』?
尤其是在String裡面更是明顯
這兩者個差異還是有的

a 是實質上真正的『沒東西』
連記憶體都是空的

b雖然也是沒東西
但是在記憶體裡面他還是佔了一個空白字元的大小
簡單說就有點像是透明人的存在
他在那, 只是你看不到他
而a就真的連透明人都沒有, 真真正正的沒東西

註3: super()
超級???
這裡並不是代表超級的意思
而是代表這個類別的父類別
雖說這是物件導向中核心中的『繼承
super表示他是呼叫他的老爸的Constructor
這部分之後就會慢慢解釋啦

=================心得=================

在發這一篇之前

我開的Android讀書會裡面也有人碰到不知道該如何寫類別

隨手寫了幾個應用方式

就想到文章裡面有些東西需要補起來

所以加了不少東西在裡面

物件導向是Java的一大門檻

跨不跨得過去就看你能領悟多少

而能不能引導你跨過去, 那就要看教學文的功力了......

我已經盡量用生活例子來舉例

剩下的就要看你的努力啦

接下來幾篇都還會圍繞在物件導向裡面

還有三大核心還沒有解釋勒.....

這一篇只是先從最基本的物件和類別先說明

類別當中還有『方法(Method)』我也還沒介紹

光是物件和類別就可以寫出那麼多鬼東西

你可要知道光是解釋這些東西需要多少力氣了吧....

那麼就下一篇見啦~~~
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4962420
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

2喜歡★jerryexcc 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:命名規則... 後一篇:Android WebP...

追蹤私訊切換新版閱覽

作品資料夾

ilove487奇幻小說連載中
《克蘇魯的黎明》0667.掉到海裡要先救誰?看更多我要大聲說5小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】