[AS3] 有無 static 修飾字的差別
※ 引述《a149851571 (yem)》之銘言:
: http://www.tink.ws/blog/as-30-hittest
: 這是一個老外寫的hittest..它可以判斷不規則形狀的物件
: 我在fla檔裡面是這樣寫的
: import ws.tink.display.*;
: var hitst:HitTest = new HitTest();
: if(hitst.complexHitTestObject(this.circle_1,this.circle_2,1))
: trace("hit!!");
: 會一直出現錯誤:
: 1061: Call to a possibly undefined method complexHitTestObject through a
: reference with static type ws.tink.display:HitTest.
: 請問我還有哪裡需要改的嗎?
因為原Po問了 有static 和 沒static 的差別...
只好拿出不大好吃的物件導向程式語言解釋一下...orz
有加 static 修飾字的 function 表示這個 function 是一個 class function
而沒有加 static 修飾字的 function 表示這是一個 object function
class function 和 object function 有啥不一樣呢...
就是一個不用 new 就可以用(static, class function),
一個要 new 才可以用(object function)。(好像廢話...orz)
事實上,這兩個在執行的時候記憶體的使用也是不一樣的...
想像一下,我們有一隻AS3程式叫做血腥 "動物園.as"
所以我的 "動物園" 這個 class 裡面我寫了兩個 function
一個是
老虎(人) {} ← 一個需要傳入<人>的 object function, 沒有 static 修飾
另一個是
static 收票員(錢) {} ← 一個傳入<錢>的 class function
所以當我在別的程式用到 動物園 裡面的 function 的時候,
我們可以 tiger_1 = new 老虎(人); ,但我們只會有一個收票員,
因為他被宣告成static。
當你的swf被 Flash Player 載入(但還沒開始執行)的時候,
他們在記憶體區塊會被分配成這樣(概念上):
┌────────────┬──────┐
│ ※老虎(人) {....} │ 位址:001 │
├────────────┼──────┤
│ ◎收票員(錢) {....} │ 位址:002 │
└────────────┴──────┘
※號表示載入時屬於object function的程式,◎表示載入時屬於class function的程式
然後,Flash Player 開始執行你的程式:new 了 tiger_1 這隻老虎
┌────────────┬──────┐
│ ※老虎(人) {....} │ 位址:001 ├─┐
├────────────┼──────┤ │
│ ◎收票員(錢) {....} │ 位址:002 │ │複製(new)一隻老虎
├────────────┼──────┤ │
│ 老虎(人) {....} │ 位址:003 │←┘←┐
├────────────┼──────┤ │這隻老虎的別名(reference)
│ tiger_1 = 003 │ 位址:004 │───┘叫作 tiger_1 指到剛剛複製
└────────────┴──────┘ 出來的位置...
但是因為 收票員 被宣告為 class function (有加 static),
所以他在記憶體中沒辦法被複製(所以才用static這英文單字),
永遠只有一份,你可以直接使用他。
而 老虎 因為被宣告為 object function (沒有static),
所以他要被複製(new)後"才"能使用,你可以複製出很多隻老虎(同時也會花掉更多記憶體)
除了記憶體使用不一樣外,在程式中這兩種東西(有static和沒static)設計的目標用途
也有些不大一樣的。(要講這用途還要再花些時間...orz)
這樣不知道有沒有了解...好像有點講太多。XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.115.166.132
※ 編輯: dreamboxer 來自: 59.115.166.132 (07/08 01:28)
推
07/08 02:04, , 1F
07/08 02:04, 1F
推
07/08 03:12, , 2F
07/08 03:12, 2F
推
07/08 10:00, , 3F
07/08 10:00, 3F
→
07/08 10:23, , 4F
07/08 10:23, 4F
推
07/08 12:40, , 5F
07/08 12:40, 5F
推
07/08 16:56, , 6F
07/08 16:56, 6F
推
07/08 21:32, , 7F
07/08 21:32, 7F
→
07/08 21:32, , 8F
07/08 21:32, 8F
推
07/08 21:34, , 9F
07/08 21:34, 9F
推
07/08 23:02, , 10F
07/08 23:02, 10F
推
07/08 23:05, , 11F
07/08 23:05, 11F
→
07/08 23:06, , 12F
07/08 23:06, 12F
推
04/30 04:20, , 13F
04/30 04:20, 13F
→
04/30 04:21, , 14F
04/30 04:21, 14F