[AS3] 有無 static 修飾字的差別

看板Flash作者 (陌生人)時間17年前 (2008/07/08 01:24), 編輯推噓10(1004)
留言14則, 9人參與, 最新討論串1/1
※ 引述《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
改一下標題方便日後的人搜尋...XD
07/08 10:23, 4F

07/08 12:40, , 5F
推圖說=w=
07/08 12:40, 5F

07/08 16:56, , 6F
最近在學Java,又看到這篇,感覺很有親切感
07/08 16:56, 6F

07/08 21:32, , 7F
所以 static class 其實在定義的時候就是一個實體
07/08 21:32, 7F

07/08 21:32, , 8F
且不用指定給變數是嗎?
07/08 21:32, 8F

07/08 21:34, , 9F
不對,我搞錯了,現在講的是 function 不是 class
07/08 21:34, 9F

07/08 23:02, , 10F
正確說 static function 是 class 擁有的 function
07/08 23:02, 10F

07/08 23:05, , 11F
1 個 class 可以有很多個 object(實體)
07/08 23:05, 11F

07/08 23:06, , 12F
因為 static function 是 class function 所以1個就好
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
文章代碼(AID): #18Sb5f4q (Flash)