AS3の継承とコンストラクタの挙動がjavaとは違う気がするよ

Javaとちょっと挙動が違った。
1.Javaは基底クラスから派生クラスへ構築が進んでいく。構築の順番は固定
2.AS3の構築はは派生クラスを先に構築させることが可能。構築の順番を指定可能
ということ。
混乱した。
派生クラスを先に構築できる仕組みは混乱する。
考えれば考えるほど頭が痛くなってくる。
どっちが正しいという問題でもなさそうだ。
速いほうが正しいけどJavaとAS3はフィールド違いすぎるしなぁ。


javaの場合

//M.java
public class M {
	public int hoge;
	
	public M(){
		hoge = 1;
	}
}

//D2.java
public class D2 extends M{
	public D2(){
		hoge = 10;
		//super();//コンパイルエラー:コンストラクタの呼び出しは、コンストラクター内の最初のステートメントである必要があります。
	}
}

となり、つねに基底クラスからコンストラクタが派生クラスへ動いていく。
派生クラスの後で基底クラスのコンストラクタが走るなどは許されない。

AS3の場合

//BaseM1.as
package  
{
  public class BaseM1
  {
    public var hoge:int;
    public var hoge2:int;
	
    public function BaseM1() 
    {
      this.hoge = 1;
      this.hoge2 = 1;
    }
  }
}

//BaseMD1.as
package  
{
  public class BaseMD1 extends BaseM1
  {
    public function BaseMD1() 
    {
      /*
       * 通常は親コンストラクタが先なので
       * このフィールドは親の後に走るので
       * hogeが10になると良い。
       */
      this.hoge = 10;
    }
  }
}

//BaseMD2.as
package  
{
  public class BaseMD2 extends BaseM1
  {
    public var hoge3:int; 
	  
    public function BaseMD2() 
    {
      hoge3 = 10
      hoge2 = 0;
      super();
      /*通常はベースクラスのコンストラクタが先であるが、
       * superによってこのコンストラクタが先にくる。
       * まず、コンパイルが通ることがびっくりさ。
       * コンパイルが通った場合でもhoge2が0には成らない。
       */
    }
  }
}

/*これを
var M1:BaseMD1 = new BaseMD1();
var M2:BaseMD2 = new BaseMD2()
var t1:TextField = new TextField();
t1.text = "M1.hoge  :" + M1.hoge.toString();
var t2:TextField = new TextField();
t2.text = "M2.hoge2:" + M2.hoge2.toString();
addChild(t1);
addChild (t2);
....てな具合に表示させると
M1.hoge:10
M2.hoge2:1
*/

となる。


オブジェクトは魔法だな、と。
以上、現実逃避でした。