顯示廣告
隱藏 ✕
看板 SuperTree
作者 dick51207 (dick51207.bbs@ptt.cc)
標題 搞懂變數、物件、參考。(Re: new 語法的疑問)
時間 2013年04月03日 Wed. PM 01:37:44


※ 本文轉寄自 dick51207.bbs@ptt.cc

看板 java
作者 brianhsu (墳墓)
標題 搞懂變數、物件、參考。(Re: new 語法的疑問)
時間 Fri Jan  1 19:58:00 2010


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

--
※ 看板: SuperTree 文章推薦值: 0 目前人氣: 0 累積人氣: 77 
※ 文章分類: 程式語言
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇