作者brianhsu (坟墓)
看板java
标题搞懂变数、物件、参考。(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)
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