我做了一個比較,java中有靜態初始化塊的概念(as3中是沒有的),格式如下:
static {
//TODO….
}
關於java中類的初始化順序,我想只要隨便搜索一下,將有超過十萬的結果出來
這裏側重點在as3的代碼
在同一包下若有三個類:
main.as<用於測試>
Parent.as 父類
SubClass.as 子類
其中SubClass繼承至Parent
父類Parent.as的代碼:
package { public class Parent { public static var p_StaticField:String = "父類--靜態變量"; public var p_field:String = "父類--變量"; public function Parent() { trace(p_field); trace('父類--構造器'); } trace(p_StaticField); } }
子類SubClass.as的代碼:
package { public class SubClass extends Parent { public static var s_StaticField:String = "子類--靜態變量"; private var s_field:String = "子類--變量"; public function SubClass() { trace(s_field); trace('子類--構造器'); } trace(s_StaticField); } }
測試類Main.as的代碼:
package { import flash.display.Sprite; import flash.events.Event; public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point new SubClass(); } } }
這裏有個問題就是,在調用類的構造函數時,類中的變量才被初始化
運行的結果顯示如下:
父類--靜態變量 子類--靜態變量 父類--變量 父類--構造器 子類--變量 子類--構造器
as3中類的初始化順序與java基本上是相同(除了as3中沒有靜態塊的概念外):
(1)當類被加載時,該類的靜態屬性和方法會被初始化
(2)初始化成員變量
(3)調用構造器
而java中:
運行的結果:
- 父類--靜態變量
- 父類--靜態初始化塊
- 子類--靜態變量
- 子類--靜態初始化塊
- 父類--變量
- 父類--初始化塊
- 父類--構造器
- 子類--變量
- 子類--初始化塊
- 子類--構造器
如果去除”靜態初始化塊”
那麼java與as3的類加載順序表現上是一致的