打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Super用法理解
学习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. }
复制代码
  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. }
复制代码
  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. }
复制代码
运行,输出结果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. }
复制代码
子类用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方法的调用;


还有需要补充完善的地方欢迎同学们发言,多多交流:)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java面向对象中:方法重载和方法重写以及区别、 this关键字和super关键字以及区别
JAVA构造函数、覆盖、隐藏
构造器中super与this语句为什么必须放在第一位?
对象与内存控制
Java无参构造方法的作用
java里的继承和封装
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服