子类继承父类的属性,考虑一般情况:
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类型情况下比较特殊:
-
package
-
{
-
import flash.display.Sprite;
-
-
public class SuperCOM extends Sprite
-
{
-
-
//protected var aa:Array;
-
//protected var aa:Number = 1.1;
-
protected var aa:Number;
-
public function SuperCOM()
-
{
-
-
}
-
-
}
-
-
}
-
[code]
-
package
-
{
-
public class SuperTest extends SuperCOM
-
{
-
-
public function SuperTest()
-
{
-
trace(aa);
-
aa = 5442;
-
//aa = ["aa", "b"];
-
trace(aa);
-
super();
-
trace(aa);
-
}
-
-
}
-
}
-
输出:
-
0
-
5442
- NaN
经分析是由于Number类型是包装的int类型,也就是从int类型扩展而来。实际默认值仍为0,只不过是人为的改为NaN。 所以第一次输出是0, 最后输出为NaN,是因为父类
的那一句protected var aa:Number;相当于protected var aa:Number; 构造函数里面(aa = NaN); 当然这种假想还需考证!