关于as 3.0继承的机制

子类继承父类的属性,考虑一般情况:
package
{
    import flash.display.Sprite;

    public class A extends Sprite
    {        
        protected var aa:Array = ["a"];
        public function A()
        {               

        }
}

}
程序主类:
package
{
    public class B extends A
    {

        public function B()
        {
            trace(aa);
            aa = ["a", "b"];            
            trace(aa);
            super();
            trace(aa);
         }

    }
}
输出: 
null
a,b
a

通过测试发现:

先说明每个类文件的编译过程,虽然是在类体里面声明了变量并赋值,但实际上是在构造函数里面才给它赋值。 也可以这样理解:因为我们所讨论的是实例属性,所以必须实例一个对象出来,才会有对应的属性以及给该属性赋值。这就意味着必须在构造函数里才会执行。

package
{
    import flash.display.Sprite;

    public class A extends Sprite
    {        
        protected var aa:Number = 5;
        public function A()
        {               

        }

}

}

可以理解为:

package
{
    import flash.display.Sprite;

    public class A extends Sprite
    {        
        protected var aa:Number;
        public function A()
        {               
            aa = 5;
        }

}

}

这里我们定义了B类继承A类,那么B类就有A类的实例属性aa, 但是B类的aa是未被赋值的,只有在B类的构造函数里执行了super();后 才会赋值。这就解释了输出为

null
a,b
a
的原因。

经测试将实例属性aa换成int等类型也成立,但是Number类型情况下比较特殊:

  1. package
  2. {
  3.         import flash.display.Sprite;

  4.         public class SuperCOM extends Sprite
  5.         {

  6.         //protected var aa:Array;
  7.         //protected var aa:Number = 1.1;
  8.         protected var aa:Number;
  9.         public function SuperCOM()
  10.         {

  11.                 }

  12.         }

  13. }
  14. [code]
  15. package
  16. {
  17.         public class SuperTest extends SuperCOM
  18.         {

  19.                 public function SuperTest()
  20.                 {
  21.                         trace(aa);
  22.                         aa = 5442;
  23.                         //aa =  ["aa", "b"];
  24.                         trace(aa);
  25.                         super();
  26.                         trace(aa);
  27.                 }

  28.         }
  29. }
  30. 输出: 
  31. 0
  32. 5442
  33. NaN

经分析是由于Number类型是包装的int类型,也就是从int类型扩展而来。实际默认值仍为0,只不过是人为的改为NaN。 所以第一次输出是0, 最后输出为NaN,是因为父类

的那一句protected var aa:Number;相当于protected var aa:Number;  构造函数里面(aa = NaN); 当然这种假想还需考证!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值