视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Super用法理解
2025-10-05 00:51:42 责编:小OO
文档
Super用法理解

本帖最后由 nickro 于 2011-3-22 20:59 编辑 

学习AS3以来,Super用法一直有点搞不清,帮助文档里说的也是含糊不清。

我们看下官方帮助先:“调用方法或构造函数的超类或父版本。在类构造函数体内使用 super() 语句时,该语句将调用构造函数的超类版本。对超类构造函数的调用必须有正确的参数数目。请注意,不管是否显式调用超类函数,都会调用到超类构造函数。如果不是显式调用它,则将在子类构造函数体中的第一个语句前自动插入不带参数的调用。这意味着,如果在子类中定义了构造函数,并且超类构造函数具有一个或多个参数,则必须显式调用具有正确参数数目的超类构造函数,否则将产生错误。然而,根据 ActionScript 2.0 的要求,对超类构造函数的调用无需是子类构造函数中的第一个语句。 在实例方法体中使用时,super 可以与 dot (.) 运算符共同使用以调用方法的超类版本,并可以选择将参数 (arg1 ... argN) 传递给超类方法。这对于创建某些子类方法很有用,这些子类方法在向超类方法添加附加行为的同时,又调用这些超类方法执行其原始行为。

在静态方法中不能使用 super 语句。”----说的还真不太清楚啊....

自己又查了一些资料,尝试了一下,终于弄清楚了,分享如下:

super有两种用法:

super([arg1, ..., argN])  和 super.method([arg1, ..., argN])

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

1.package  

2.{

3.        import flash.display.Sprite;

4.        /**

5.         * ...

6.         * @author nickro

7.         */

8.        public class SuperExample extends Sprite

9.        {                                

10.                public function SuperExample() 

11.                {

12.                        trace("Super_z")

13.                }

14.        }

15.

16.}

复制代码

1.package  

2.{

3.        /**

4.         * ...

5.         * @author nickro

6.         */

7.        public class SubSuper extends SuperExample

8.        {

9.                

10.                public function SubSuper() 

11.                {

12.                        super();

13.                }

14.        }

15.

16.}

复制代码

1.package  

2.{

3.        import flash.display.Sprite;

4.        /**

5.         * ...

6.         * @author nickro

7.         */

8.        public class Main extends Sprite

9.        {

10.                

11.                public function Main():void

12.                {

13.                        var _example:SubSuper = new SubSuper();

14.                }

15.        }

16.

17.}

复制代码

运行,输出结果Super_z,为什么会是这个结果呢?这是由于子类中‘显式调用’了super()的作用,子类初始化的时候一定会执行一次父类的构造函数;

但子类也可以不写super(),同样结果也会输出Super_z,这种叫‘隐式调用’;

‘显式调用’和‘隐式调用’与别在于父类的构造函数是否有参数。 

1.public function SuperExample(parm:String) 

2.                {

3.                        trace("Super_z")

4.                }

复制代码

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

若父类无参,则可‘隐式调用’或‘显式调用’不带参数的super();

第二种:super.method([arg1, ..., argN])

我们来为父类添加一个方法 说明 

1.package  

2.{

3.        import flash.display.Sprite;

4.        /**

5.         * ...

6.         * @author nickro

7.         */

8.        public class SuperExample extends Sprite

9.        {

10.                        public function SuperExample() 

11.                {

12.                        

13.                }

14.                public function sp_Func() {

15.                          trace("Super_a")

16.                }

17.        }

18.

19.}

复制代码

子类用super调用该方法: 

1.package  

2.{

3.        /**

4.         * ...

5.         * @author nickro

6.         */

7.        public class SubSuper extends SuperExample

8.        {

9.                

10.                public function SubSuper() 

11.                {

12.                        super.sp_Func()                        

13.                }

14.        }

15.}

复制代码

1.主类Main不变

复制代码

运行,输出结果: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方法的调用;

还有需要补充完善的地方欢迎同学们发言,多多交流:)

下载本文
显示全文
专题