Super用法深透理解

学习AS3以来,Super用法一直有点搞不清,帮助文档里说的也是含糊不清。。
我们看下官方帮助先:“调用方法或构造函数的超类或父版本。在类构造函数体内使用 super() 语句时,该语句将调用构造函数的超类版本。对超类构造函数的调用必须有正确的参数数目。请注意,不管是否显式调用超类函数,都会调用到超类构造函数。如果不是显式调用它,则将在子类构造函数体中的第一个语句前自动插入不带参数的调用。这意味着,如果在子类中定义了构造函数,并且超类构造函数具有一个或多个参数,则必须显式调用具有正确参数数目的超类构造函数,否则将产生错误。然而,根据 ActionScript 2.0 的要求,对超类构造函数的调用无需是子类构造函数中的第一个语句。 在实例方法体中使用时,super 可以与 dot (.) 运算符共同使用以调用方法的超类版本,并可以选择将参数 (arg1 … argN) 传递给超类方法。这对于创建某些子类方法很有用,这些子类方法在向超类方法添加附加行为的同时,又调用这些超类方法执行其原始行为。 在静态方法中不能使用 super 语句。”
—-说的还真不太清楚啊….
自己又查了一些资料,尝试了一下,终于弄清楚了,分享如下:
super有两种用法:
super([arg1, ..., argN]) 和 super.method([arg1, ..., argN])

第一种 super([arg1, ..., argN]):(看下面例子)

//父类
package  
{ 
        import flash.display.Sprite; 
        /** 
         * ...
          * @author nickro 
         */ 
        public class SuperExample extends Sprite
         {                                
                public function SuperExample() 
                {
                        trace("Super_z")
                }
 
        }
}

//子类
package 
{ 
        /** 
         * ... 
         * @author nickro 
         */ 
        public class SubSuper extends SuperExample 
        {                 
                public function SubSuper() 
                { 
                        super(); 
                }
         }
}

//主类
package   
{ 
        import flash.display.Sprite; 
        /** 
         * ... 
         * @author nickro 
         */ 
        public class Main extends Sprite 
        {     
                public function Main():void 
                { 
                        var _example:SubSuper = new SubSuper(); 
                } 
        }
}

运行,输出结果Super_z,为什么会是这个结果呢?这是由于子类中‘显式调用’了super()的作用,子类初始化的时候一定会执行一次父类的构造函数;
但子类也可以不写super(),同样结果也会输出Super_z,这种叫‘隐式调用’;‘显式调用’和‘隐式调用’与别在于父类的构造函数是否有参数。

public function SuperExample(parm:String) 
                {
 
                        trace("Super_z")
 
                }

若父类有参数(如上),则子类SubSuper 中必须‘显式调用’:super(参数)———-注:显式调用需具有正确参数数目的超类构造函数,否则将产生错误
若父类无参,则可‘隐式调用’或‘显式调用’不带参数的super();

第二种:super.method([arg1, ..., argN])
我们来为父类添加一个方法 说明


//父类
package   
{ 
        import flash.display.Sprite; 
        /** 
         * ... 
         * @author nickro 
         */ 
        public class SuperExample extends Sprite 
        { 
                public function SuperExample() 
                { 
 
                } 
                public function sp_Func() { 
                          trace("Super_a") 
                } 
        }
}

子类用super调用该方法:

package   
{ 
        /** 
         * ... 
         * @author nickro 
         */ 
        public class SubSuper extends SuperExample 
        {     
                public function SubSuper() 
                { 
                        super.sp_Func()                        
                } 
        } 
}

//主类
package   
{ 
        import flash.display.Sprite; 
        /** 
         * ... 
         * @author nickro 
         */ 
        public class Main extends Sprite 
        {     
                public function Main():void 
                { 
                        var _example:SubSuper = new SubSuper(); 
                } 
        }
}

运行,输出结果:Super_a
这种方法可以理解为super 当做一个变量,当做父类的引,通过super.方法() 或者 super.属性,可以访问父类中的方法和属性。大家可试试
super.method([arg1, ..., argN]) 带参数的方法和第一种带参的用法一致,不多说

总结一下注意点:
1. super为父类超类的引用,我们可以把super当作父类的一个实例(实际上并不是实例,这样便于理解)
2.子类在初始化时一定会先执行父类的构造函数,不管是显式还是隐式,这是必须的!
3.父类有参时,super必须要显式调用且参数正确;无参时可隐式调用或显式调用不带参的super();
4. 第二种理解为 super.方法()或者super.属性 调用
5. 若子类重写,需添加一些功能,则要用到super,再次调用父类方法,使其保留,否则重写就把父类的方法都删掉了。(看个人需求)
6.父类的构造函数带参,子类的构造函数可以不带参.但是父类如果为被直接调用则必须有默认参数,否则报错”未找到基类构造函数的默认参数”;
7.子类可以直接super(“nickro”)传给父类参数;
8.super关键字可以理解成父类的实例,比如父类有方法father();则可以直接super.father();调用父类方法,同时子类重写了father方法的话,也可以以此来分别获得子类和父类的father方法的调用;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云飞扬扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值