子类继承父类的属性,考虑一般情况:
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); 当然这种假想还需考证!