搞懂變數、物件、參考。(Re: new 語法 …
※ 引述《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)
推
01/01 20:12, , 1F
01/01 20:12, 1F
→
01/01 20:14, , 2F
01/01 20:14, 2F
※ 編輯: brianhsu 來自: 59.120.199.114 (01/01 20:24)
推
01/01 20:25, , 3F
01/01 20:25, 3F
→
01/01 20:39, , 4F
01/01 20:39, 4F
→
01/01 20:39, , 5F
01/01 20:39, 5F
→
01/01 20:43, , 6F
01/01 20:43, 6F
→
01/01 20:44, , 7F
01/01 20:44, 7F
→
01/01 20:46, , 8F
01/01 20:46, 8F
推
01/01 23:11, , 9F
01/01 23:11, 9F
→
01/01 23:13, , 10F
01/01 23:13, 10F
推
04/20 20:31, , 11F
04/20 20:31, 11F
→
04/20 20:32, , 12F
04/20 20:32, 12F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 4 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章