最近有不少网友在问这个super的用法,今天就写了个例子来给大家讲讲!
先看看官方帮助文档是怎么说的:
调用方法或构造函数的超类或父版本。在类构造函数体内使用 super() 语句时,该语句将调用构造函数的超类版本。对超类构造函数的调用必须有正确的参数数目。请注意,不管是否显式调用超类函数,都会调用到超类构造函数。如果不是显式调用它,则将在子类构造函数体中的第一个语句前自动插入不带参数的调用。这意味着,如果在子类中定义了构造函数,并且超类构造函数具有一个或多个参数,则必须显式调用具有正确参数数目的超类构造函数,否则将产生错误。然而,根据 ActionScript 2.0 的要求,对超类构造函数的调用无需是子类构造函数中的第一个语句。 在实例方法体中使用时,super 可以与 dot (.) 运算符共同使用以调用方法的超类版本,并可以选择将参数 (arg1 ... argN) 传递给超类方法。这对于创建某些子类方法很有用,这些子类方法在向超类方法添加附加行为的同时,又调用这些超类方法执行其原始行为。
在静态方法中不能使用 super 语句。
好了下面是我写的例子,关键的知识点在代码里都有注释!
先写个父类SuperClass:
package
{
import flash.display.Sprite;
/**
* ...
* @author .....Li灬Star
* @contact...QQ:168527720
*/
public class SuperClass extends Sprite
{
public var superType:String;
/**
* 构造函数不带参数
*/
/*public function SuperClass()
{
trace("Super_Star");
}*/
/**
* 构造函数带参数
*/
public function SuperClass(_superType:String)
{
superType = _superType;
}
public function superFun():void {
trace("superFun");
}
}
}
然后写个子类SubClass来继承这个父类
package
{
/**
* ...
* @author .....Li灬Star
*/
public class SubClass extends SuperClass
{
public function SubClass()
{
/**
* 在子类构造函数中使用super()叫显示调用
* 不使用super()的话,编译器会在子类构造函数第一个语句前自动调用父类的构造函数,这叫隐式调用
* 如果父类的构造函数有参数的话,则必须显示调用,而且要有正确的参数数目
* 子类在初始化时一定会先执行父类的构造函数,不管是显式的还是隐式的
*/
//super(); //父类构造函数不带参数时,可隐式调用或显示调用,不管写不写super(),都会输出Super_Star
super("subType"); //父类构造函数带参数时,则要写入正确的参数值
}
}
}
最后是主类Main:
package
{
import flash.display.Sprite;
import flash.events.Event;
/**
* ...
* @author .....Li灬Star
* @contact...QQ:168527720
*/
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var _subClass:SubClass = new SubClass();
trace(_subClass.superType); //subType
_subClass.superFun(); //调用父类方法,输出superFun
}
}
}
先看看官方帮助文档是怎么说的:
调用方法或构造函数的超类或父版本。在类构造函数体内使用 super() 语句时,该语句将调用构造函数的超类版本。对超类构造函数的调用必须有正确的参数数目。请注意,不管是否显式调用超类函数,都会调用到超类构造函数。如果不是显式调用它,则将在子类构造函数体中的第一个语句前自动插入不带参数的调用。这意味着,如果在子类中定义了构造函数,并且超类构造函数具有一个或多个参数,则必须显式调用具有正确参数数目的超类构造函数,否则将产生错误。然而,根据 ActionScript 2.0 的要求,对超类构造函数的调用无需是子类构造函数中的第一个语句。 在实例方法体中使用时,super 可以与 dot (.) 运算符共同使用以调用方法的超类版本,并可以选择将参数 (arg1 ... argN) 传递给超类方法。这对于创建某些子类方法很有用,这些子类方法在向超类方法添加附加行为的同时,又调用这些超类方法执行其原始行为。
在静态方法中不能使用 super 语句。
好了下面是我写的例子,关键的知识点在代码里都有注释!
先写个父类SuperClass:
package
{
import flash.display.Sprite;
/**
* ...
* @author .....Li灬Star
* @contact...QQ:168527720
*/
public class SuperClass extends Sprite
{
public var superType:String;
/**
* 构造函数不带参数
*/
/*public function SuperClass()
{
trace("Super_Star");
}*/
/**
* 构造函数带参数
*/
public function SuperClass(_superType:String)
{
superType = _superType;
}
public function superFun():void {
trace("superFun");
}
}
}
然后写个子类SubClass来继承这个父类
package
{
/**
* ...
* @author .....Li灬Star
*/
public class SubClass extends SuperClass
{
public function SubClass()
{
/**
* 在子类构造函数中使用super()叫显示调用
* 不使用super()的话,编译器会在子类构造函数第一个语句前自动调用父类的构造函数,这叫隐式调用
* 如果父类的构造函数有参数的话,则必须显示调用,而且要有正确的参数数目
* 子类在初始化时一定会先执行父类的构造函数,不管是显式的还是隐式的
*/
//super(); //父类构造函数不带参数时,可隐式调用或显示调用,不管写不写super(),都会输出Super_Star
super("subType"); //父类构造函数带参数时,则要写入正确的参数值
}
}
}
最后是主类Main:
package
{
import flash.display.Sprite;
import flash.events.Event;
/**
* ...
* @author .....Li灬Star
* @contact...QQ:168527720
*/
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var _subClass:SubClass = new SubClass();
trace(_subClass.superType); //subType
_subClass.superFun(); //调用父类方法,输出superFun
}
}
}