ActionScript 3.0/類結構簡介
關鍵概念
- 物件、方法和屬性
- 類
- 包
- 匯入
- 變數和常量
- 整合開發環境
- 編譯
- 文件類
- 物件例項化
定義:類在社會中的組織
啊,類。ActionScript 專案本質上是由類組成的。(好吧,也有介面,但我們將在後面介紹。)
面向物件程式設計,顧名思義,是一種**程式設計正規化**,它涉及**物件**的建立和相互作用。一個物件由兩部分組成
- **屬性**定義物件的特徵。例如,蘋果可能具有“大小”、“顏色”、“汁液含量”等屬性。
- **方法**定義物件可以做什麼。方法是**函式**的一個子集,我們將在後面討論。蘋果可能具有“運輸”、“食用”等方法。
ActionScript 3.0 中的類看起來像這樣。讓我們逐一檢視它的元素。
package {
import flash.display.Sprite;
import flash.events.Event;
/**
* @author WikibooksOverlord
*/
public class Main extends Sprite{
private const HELLO_WORLD:String = "Hello, world!";
private var _username:String = "Daniel";
public function Main():void{
if (stage) init(null);
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
//You can start changing from this line.
trace(HELLO_WORLD); //This line outputs 'Hello, world!' for now.
trace("Your name is " + name + ".");
//Don't touch anything below this line.
}
}
}
package {
**包**是特定目錄中的一組類和其他內容。上面的程式碼行稱為**包定義**。例如,名為“fruit”的包可能包含 Fruit 和 Apple 等類。
這裡的“package”一詞是**關鍵字**。關鍵字是語言用來執行基本操作的詞語。
在我們的例子中,我們的類儲存在主包中,因此我們不需要在“package”關鍵字之後新增其他資訊。為了指定我們的類位於“food”包中,我們可以在“package”關鍵字後追加包名
package food{
如果“food”包中有一個“fruit”包,我們用點(“.”)分隔較大的包和較小的包
package food.fruit{
除了提高組織性之外,包中的類可以與其他包中的類具有相同的名稱。包名是區分它們的方法。你可以在 applicances.Iron 和 materials.Iron 中分別擁有一個名為 Iron 的類。
注意,定義後的左大括號與類檔案末尾的右大括號相匹配。程式中的其他所有內容都設定為包含在這個**塊**中。塊是邏輯上的“命令”或**指令**單元,用一對大括號括起來。按照慣例,塊中的所有內容都應該縮排,如上所示。縮排極大地提高了程式碼的可讀性,但對於程式執行不是必需的。(實際上,你可以將類中的所有內容放在一行中,它仍然可以工作;但是,程式碼將不再可讀。)
還要注意,所有包名都以小寫字母開頭,而所有類名都以大寫字母開頭。這是一個普遍接受的慣例,應該遵循,即使程式碼仍然可以工作,你也可以不遵守。
import flash.display.Sprite;
import flash.events.Event;
如果我們想使用其他包中的類,例如**標準庫**,則需要**匯入語句**。在本例中,我們從標準庫中匯入了兩個包:flash.display.Sprite 和 flash.events.Event。標準庫是一堆程式碼,控制著我們的 Flash 操作的基本操作,例如文字、圖形、聲音等等。標準庫有一些替代方案,但在這裡不作介紹。
有時,如果我們很懶,可以使用星號 (*) 匯入包中的所有內容
import flash.events.*;
如你所見,匯入語句的語法是“import”關鍵字,後跟包的路徑。請注意,雖然 flash.display.Sprite 和 flash.events.Event 是預定義的類,但它們不是關鍵字,因為它們屬於標準庫而不是語言本身。
匯入後,我們可以以任何我們想要的方式使用這些類。
類結構:社會中類的組織。
public class Main extends Sprite{
在此語句中,“public”關鍵字告訴我們,即使我們位於當前包之外,也可以使用該類。這被稱為**名稱空間屬性**。名稱空間處理**訪問控制**;也就是說,如何訪問該類(令人驚訝的是)。類只有兩種可能的名稱空間屬性
public告訴我們,我們可以在任何地方使用該類。internal告訴我們,我們可以在同一個包的類中使用該類。這是預設屬性,因此,如果你完全跳過名稱空間屬性,名稱空間將自動設定為“internal”。
在名稱空間屬性之後,我們發現了另一個關鍵字“class”。然後我們看到了類識別符號 Main。(**識別符號**是“名稱”,在名稱空間內唯一標識某物。某物的完整名稱是名稱空間加上識別符號。這將在後面介紹;現在,你只需將“識別符號”一詞視為特殊的“名稱”。)
在那之後,我們看到了關鍵字“extends”,後跟類名“Sprite”。這表明我們的 Main 類是 Sprite 類的**子類**。稍後,當我們瞭解 Main 類到底是什麼以及子類是什麼時,你將理解我們在這一行中做了什麼。現在,就先把它當作理所當然吧。
類成員包括屬性和方法。屬性可以是**常量**(永不改變)或**變數**(會改變)。
private const HELLO_WORLD:String = "Hello, world!";
private var _username:String = "Daniel";
“private”是我們用於類成員的另一個名稱空間屬性。有四個可能的名稱空間屬性(除了使用者定義的屬性之外)
public告訴我們,我們可以在任何地方使用該成員。internal告訴我們,我們可以在同一個包的類中訪問該成員。這是預設屬性,因此,如果你完全跳過名稱空間屬性,名稱空間將自動設定為“internal”。稍後,我們將學習訪問其他類的成員。protected告訴我們,只有類本身及其子類才能訪問該成員。private是最嚴格的屬性。只有類本身才能訪問該成員。即使是子類也沒有許可權。
一般來說,我們選擇的屬性應該儘可能地嚴格。
在上面的程式碼行中,我們定義並初始化了一個常量和一個變數。在下一章中,我們將介紹這兩行程式碼實際上做了什麼。
以下是我們的**方法定義**
public function Main():void{
if (stage) init(null);
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
//You can start changing from this line.
trace(HELLO_WORLD); //This line outputs 'Hello, world!' for now.
trace("Your name is " + name + ".");
//Don't touch anything below this line.
}
在上面,我們可以看到兩個方法定義:Main 和 init。Main 被稱為類的**建構函式**。當類初始化時,將呼叫此方法進行設定。請注意,建構函式始終是 public 的。init 是一個私有函式,只能在類內部呼叫。
這段程式碼片段中有很多你還不理解的東西。別擔心——我們會在第一部分介紹所有內容。現在,就先把它當作理所當然吧!
**註釋**不會改變程式的工作方式,但它是向程式新增資訊(無論是為了你自己還是其他程式設計師)的有效方法。有兩種型別的註釋
第一種型別的註釋以 // 開頭,並新增到行尾。它不能擴充套件到一行以上。這種型別的註釋通常用於解釋程式碼。
trace(HELLO_WORLD); //This line outputs 'Hello, world!' for now.
trace("Your name is " + name + ".");
//Don't touch anything below this line.
第二種型別的註釋,用 /* 和 */ 包圍,可以跨越多行。/* 標記註釋的開始,*/ 標記註釋的結束。這種型別的註釋也可以新增到一行的中間。它們被廣泛用於諸如待辦事項列表和版權資訊之類的元素。這是一個例子
/*Lorem ipsum
The quick brown fox
Jumped over the lazy dog */
正如您可能已經注意到的,這種型別的註釋確實出現在我們的 Main 類中。但是,它看起來有點不同。這是因為它是一個 **Javadoc 註釋**,將在稍後介紹。
/**
* @author WikibooksOverlord
*/
有時,我們需要暫時“隱藏”一些程式碼。這可以透過將程式碼轉換為註釋來實現。這種技術被稱為 **註釋掉**。
我們在上面建立的 .as 檔案只是一個文字檔案;它沒有為我們做任何建設性的工作。為了使程式工作,我們需要一個 **編譯器**。在開始編譯器之前,讓我們看一下用於 ActionScript 編碼的不同 **整合開發環境** (IDE)。儘管您可以使用文字編輯器用 ActionScript 編碼並將其輸入到命令列編譯器中,但不建議這樣做。整合開發環境通常包含以下功能
- 專案管理系統,用於組織專案使用的資源和檔案。
- **語法高亮**是一種功能,其中程式碼的不同部分被著色以提高程式碼可讀性。在這本書中,語法著色是透過 MediaWiki 軟體實現的。
- **程式碼提示**透過提醒您接下來需要輸入的內容來加快開發速度。
- **語法檢查器**用於檢查您的語法。
- 內建 **編譯器** 和 **除錯實用程式** / **偵錯程式**,允許您在 IDE 中編譯和除錯。我們將在稍後介紹偵錯程式。
一個好的 IDE 還提供了用於編輯相關標記語言的功能,例如 **MXML**(這超出了本書的範圍,但對於 ActionScript 介面非常有用)。
Flash 的常見 IDE 包括
- **Flash Professional**:第一個 Flash 製作軟體,Flash Professional 將動畫和編碼合併到一個軟體中。但是,它的 IDE 功能因此受到限制。Flash CS3 及更高版本支援 AS3。
- **Eclipse**:一個通用的 IDE,用於許多不同的語言,包括 ActionScript。
- **Flash Builder**:一個基於 Eclipse 的專有 IDE。
- **FlashDevelop**:一個面向 ActionScript 的開源 IDE。它提供了諸如 SharedObject 跟蹤之類的便利功能,還包含高階程式碼提示功能。
在這本書中,我們將提供有關 FlashDevelop 的說明。如果您使用其他 IDE,請參閱相關文件。
計算機只理解機器語言。ActionScript 是一種人類可讀的語言,但不是計算機可讀的語言。語言級別越高,它就越接近計算機系統。機器程式碼和組合語言是最低階的語言,因為它們直接控制計算機系統的不同部分。高階語言必須轉換為低階語言,才能被計算機理解。編譯器是一個程式,它將程式碼從高階程式語言轉換為低階語言。
對於 ActionScript,它稍微複雜一些。ActionScript 編譯器將我們的 ActionScript 編譯為一種稱為 **ActionScript 位元組碼** (ABC) 的低階語言。然後,ABC 與資源(音樂、圖形等)打包在一起,形成另一個稱為 **Shockwave Flash 檔案** (SWF) 的檔案,這是由 SWF 編譯器執行的魔法。Flash Professional 使用名為 **Flash 編譯器** 的 SWF 編譯器,而 FlashDevelop、Flash Builder 等則使用名為 **Flex 編譯器** 的 SWF 編譯器。
然後,ABC 由一個稱為 **Flash Player** 的 **執行時環境** 使用嵌入的資源執行。執行時環境將 ABC 編譯為控制計算機硬體的機器語言。這種轉換是即時執行的,被稱為 **即時編譯**。
編譯有兩種型別:**除錯構建** 和 **釋出構建**。除錯構建是您在專案開發期間構建的。一旦您的專案準備好編譯,您將編譯釋出構建,它更快、更輕量級。為了在構建之間切換,FlashDevelop 在頂部有一個工具欄,其中有一個下拉選單,當您將滑鼠懸停在上面時會顯示工具提示“選擇配置”。
現在開啟您選擇的 IDE 並建立一個新專案。在 FlashDevelop 中,點選專案 > 新建專案 > AS3 專案。為您的專案命名您想要的任何名稱。現在將以下資料夾新增到專案的主資料夾中(如果它們還不存在)
- **src** 包含專案的原始碼。
- **bin** 包含專案的已編譯二進位制檔案(即 SWF 檔案,如果您仔細閱讀了上一節)。
接下來,在 IDE 的“專案”螢幕中,找到 Main 類。如果它不存在,請建立一個。將上面的程式碼直接複製到文字檔案中。將其設定為文件類(在 FlashDevelop 中,右鍵單擊專案視窗中的檔案並選中“文件類”)。
現在,將編譯器設定為編譯到 \bin\MyFile.swf(專案 > 屬性 > FlashDevelop 中的輸出)。現在編譯並執行專案(CTRL + ENTER 或 FlashDevelop 中的藍色“播放”按鈕)。
如果您已正確執行所有操作,您應該在 IDE 的輸出螢幕中看到以下內容
Hello, world! Your name is Daniel.
啟動 Flash 應用程式後,發生的第一件事是
- 文件類的例項被例項化。
- 新例項被新增到舞臺上。
現在,您可能完全困惑了。不要讓這些新詞嚇倒您!我們將逐一瞭解所有內容。
假設我們現在有一個名為 Apple 的類。幸運的是,在程式設計世界中,您不需要花時間種植蘋果。您所需要做的就是建立 Apple 類的 **例項**。要建立 200 個蘋果,請建立 Apple 類的 200 個例項。建立例項稱為 **例項化**。
通常,物件例項化是使用 new 關鍵字完成的。例如,表示式 new Apple() 例項化一個新的蘋果。(注意,這裡可以省略圓括號。)但是,我們這裡的 Main 類是一個 **文件類**。這意味著執行時環境非常友好地為我們例項化了 Main 類。