java 板


LINE

※ 引述《SuperNeo (潛水初號機)》之銘言: : ∣________∣ new : (指標?)c1--> ∣_Circle_∣--------- : ↑ ∣________∣ ∣ : ∣ ∣________∣ ∣ : ∣ ↓ : ∣ Circle的物件 : ∣ ________ : ∣ | | : ---------------------| | : 把Circle物件指向c1 (=?) |________| : 我理解是這個樣子 不知是不是了-_-" 雖然你想畫圖,但我覺得你的觀念好像有嚴重的錯誤。囧。 下面是非常低階的碎碎念,講的是現在市面上一般的程式書籍愈來愈少提到的 部份,至於看不看得完,看完後有沒有用,就要看造化了。XD 我只能說,自從我建立了以下的 Mental Model 後,基本上學任何 OO 或 程序導向語言都沒遇到過什麼困難(學 functional programming 的時候倒 是問題一堆),所以有用沒用就要看個人了。 看完一整個討論串,我先說結論吧: 1. 個人認為你需要的是一本入門的程式設計書籍,一整個討論串下來感覺你 很多基本觀念都沒有就想一步登天搞到進階的觀念。 2.老實說,我還是覺得把基礎功練好一點比較實在。orz... 什麼是基礎功? * 小人電腦 / Native Binary / VM / Bytecode / Memory Model 間的關聯 * Pointer (真正可以給你胡亂操作的指標,C 是最好的範例,但也最讓人害怕) * 如果你想學任何 OO 語言,先搞懂類別和物件的關聯吧 雖然就算講到嘴破了,還是有很多人覺得不懂第一點和第二點的那一大堆東 西無傷大雅,一樣可以寫程式。但我還是堅持這是基礎中的基礎,搞懂了學 什麼語言都不會有大問題。 回到正題,先不論多型的部份(你的程式碼裡 Shape a = new Circle 的那一 部份),單看下面這隻完整的 Java 程式好了。 ===== ClassExample.java ===== 1 public class ClassExample 2 { 3 int x = 3; 4 5 public static void main (String [] args) 6 { 7 int stackVar = 10; 8 9 ClassExample ex = new ClassExample (); 10 System.println ("ex.x = " + ex.x); 11 12 return; 13 } 14 } ============================ 我知道,接下來講的東西對很多初學者來說很瑣碎,但我認為從一開始就建立 正確並且一致的 Mental Model 會讓以後的學習順利的很多,很多進階的觀念 也比較容易吸收。 這隻程式在做什麼?『建立一個 ClassExample 物件,並且把這個物件裡面的 x 成員函數印出』,好簡單的一句話,好複雜的程式。 首先,你要了解一個程式可以大致區分成兩個部份:CODE 與 DATA,CODE 指 的是程式的『指令』,也就是大致相當於你寫出來的程式碼,告知電腦每一步 該如何做。 這個部份是永恆不變的,不管你執行幾次,只要你沒更動過你的程式碼,就永 永不會變。 DATA 是你程式裡放在『記憶體』裡的『資料』的部份,是會隨著環境和你程 式執行的過程中而更動的,例如程式裡的『變數』、『物件』都是屬於 DATA 的部份。 舉例來說 x = 10 這個敘述,『把 x 指定成 10』的動作是『CODE』,而 x 就 是 DATA,而這個 DATA 是放在記憶體中的。 『記憶體』,關鍵字出來了,所有『變數』、『物件』都是放在記憶體中的。 但『記憶體』並沒那麼簡單,『記憶體』又可以分成兩部份,一個是 stack,另 一個是 Heap ,請簡單記住以下幾個觀念: 1. Java 裡所有的區域變數、函數的所傳入的參數都放在 Stack。 2. Stack 的生命週期只有從『進入函式』到『離開函式』這段期間。 3. 所有物件都在 Heap 以上是關於 Stack 和 Heap 的原則,至於到底什麼是 Stack 和 Heap,請 Google 一下唄,了解這兩者是很有幫助的。 接下來,要了解的是關於『變數』這回事,Java 裡你會在函式裡看到三種型態的 變數宣告,分別如下: 1 void func () 2 { 3 int x = 10; // Type 1 4 Object object; // Type 2 6 int [] array; // Type 3 7 Object [] array2 // Type 4 8 9 object = new Object (); 11 array = new int[2] 11 array2 = new Object[2] 12 } 第一種(第三行的部份),資料型態小寫開頭的,那叫『基礎資料型態』,包括 內建的 int/double 這種東西,遇到這種的請記住這個口訣:『Stack 上長了一 塊叫做 x 的東西,他的內容是整數十(或浮點數 3.14 等)』。 第二種(第四行的部份),資料型態是大寫開頭的,也就是 Class 的部份,注 意,這是陷阱,請謹記這個口訣:『Stack 上長了一個叫做 object 的東西, 他的內容是「記憶體地址」,而且這個地址應該指到 Heap 裡面一個類別為 Object 的物件。』 第三種是第二種的特例,因為實際上 Java 的陣列也是物件,所以請記得以下的 口訣:『Stack 上長了一個叫做 array 的東西,他的內容是記憶體地址,而且這個 地址應該指到 Heap 裡面一個陣列物件,而這個陣列裡面的每個原素應該要是 int。』 第四種又是第三種的特例,不同的地方在於陣列裡每個原素存的也是『記憶體地 址』,口訣:『Stack 上長了一個叫做 array2 的東西,他的內容是記憶體地址, 而且這個地址應該指到 Heap 裡面一個陣列物件,而這個陣列裡面的每個原素也 是一個記憶體地址,而這些記憶體地址應該指到類別為 Object 的物件。』 ========================================================================= 請覆誦: Type 1:『Stack 上長了一塊叫做 x 的東西,他的內容是整數十。』 Type 2:『Stack 上長了一個叫做 object 的東西,他的內容是「記憶體地址」, 而且這個地址應該指到 Heap 裡面一個類別為 Object 的物件。』 Type 3:『Stack 上長了一個叫做 array 的東西,他的內容是記憶體地址,而且 這個地址應該指到 Heap 裡面一個陣列物件,而這個陣列裡面的每個原 素應該要是 int。』 Type 4:『Stack 上長了一個叫做 array2 的東西,他的內容是記憶體地址,而且 這個地址應該指到 Heap 裡面一個陣列物件,而這個陣列裡面的每個原 素也是一個記憶體地址,而這些記憶體地址應該指到類別為 Object 的 物件。』 PS. 上述口訣裡的『應該』都是有理由的,請不要省略,將來遇到多型的部份就不 會覺得奇怪了! ========================================================================= 累了,等下再繼續寫畫圖的部份。 -- ~ 白馬帶著她一步步地回到中原。白馬已經老了,只能慢慢地走, 'v' Brian Hsu 但終是能回到中原的。江南有楊柳、桃花,有燕子、金魚…… // \\ ( 墳 墓 ) /( )\ 但這個美麗的姑娘就像古高昌國人那樣固執。 【白馬嘯西風】 ^`~'^ http://bone.twbbs.org.tw/blog 『那都是很好很好的,可我偏不喜歡。』 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.199.114 ※ 編輯: brianhsu 來自: 59.120.199.114 (01/01 20:01)
1F:推 dendrobium:好長的口訣XD 01/01 20:12
2F:→ dendrobium:建議不要幾乎整段都畫重點,這樣等於沒畫...而且很傷眼 01/01 20:14
※ 編輯: brianhsu 來自: 59.120.199.114 (01/01 20:24)
3F:推 ogamenewbie:其實我覺得整段畫有他的優點在, 但是顏色的確有點太亮 01/01 20:25
4F:→ johnhmj:Stack長了一塊青春痘… XD 哈哈哈… 01/01 20:39
5F:→ adrianshum:我覺得先不需要談stack和heap, 不然太多恐怕吸收不了 01/01 20:39
6F:→ brianhsu:先談 Stack/Heap 才有辦法建立一致,將來也不會變的 01/01 20:43
7F:→ brianhsu:Mental Model 啊,這是兩難。XD 01/01 20:44
8F:→ brianhsu:例如 scope,GC 等,都和是在 Stack 或 Heap 有關的。 01/01 20:46
9F:推 vencees:推好長的口訣XD 01/01 23:11
10F:→ brianhsu:獨孤九劍光總訣式就三千字啦!這一點都不長。XD 01/01 23:13
11F:推 papayamilk:推 04/20 20:31
12F:→ papayamilk:推 04/20 20:32







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP