当'SubClass'扩展'SuperClass'时,当它继承了它的方法和属性时,它会创建区别于'SuperClass'的方法和属性吗?
或者,如果我创建了一个'SubClass'实例,并且我尝试修改一个继承自'SuperClass'的属性,我是否也修改了超类属性?
感谢。
编辑
package {
public class SubClass extends SuperClass {
public function SubClass() {
trace('superclass value n='+superClass.n+'\n');
trace('subclass changes inherited n'+'\n');
n = 3;
trace('subclass value n='+n+'\n');
trace('superclass value n='+superClass.n+'\n');
}
}
}
返回我:
superclass value n=-1;
subclass changes inherited n;
subclass value n=3;
superclass value n=3;
答案 0 :(得分:2)
我将简要解释一下。
我们有两个类 - Subclass和SuperClass。
SuperClass有四种方法:
来自您的子类:
但您可以覆盖这些方法。覆盖不会更改SuperClass的方法,只会在SubClass中更改它们。
override public function methodPublic() : void {
// your additional code
super.methodPublic(); // eventually calling the same method of SuperClass, you can pass arguments to it also
}
如您所知,您的SuperClass也可以包含变量,也可以是公共变量,受保护变量,私有变量或内部变量。你无法覆盖它们,但是你可以用getter或setter来做到这一点。
您可以使用“super”这样的单词“super”来访问创建为公共或受保护的变量:super.someVariable。
所以一切都取决于你,如果你想在SuperClass和SubClass中创建同名的不同变量,只需在SuperClass中将其声明为私有。如果你想拥有一个SuperClass和SubClass都可以访问的变量 - 只需将其声明为protected或public。
希望很清楚。
答案 1 :(得分:1)
当您创建一个空白的SubClass扩展SuperClass时,您正在创建一个新类,它为父类提供相同的接口(具有相同的实现)。
也就是说,如果您的父类包含方法doSomething
,那么您的SubClass在没有实际编写的情况下也会使用doSomething
方法。需要注意的是,如果方法标记为private
,那么继承类SubClass将无法访问。
package {
public class SuperClass {
public function SuperClass():void {
self.doSomething();
}
public function doSomething():void {
trace("doing something");
}
}
package {
import SuperClass;
public class SubClass extends SuperClass {
public function SubClass():void {}
}
}
建立此关系后,您可以决定在SubClass实例上调用doSomething
的行为是否与SuperClass中定义的默认实现不同。如果您想要相同的行为,请保持原样。如果您需要不同的行为,则使用关键字override
覆盖父类的方法。
package {
import SuperClass;
public class SubClass extends SuperClass {
public function SubClass():void {}
override public function doSomething():void {
trace("doing another thing instead");
}
}
}
现在,在SubClass实例上调用doSomething
的东西会得到修改后的行为。但是没有触及默认实现。这种覆盖方法不会修改SuperClass的实例。只有SubClass的实例会受到影响。
这是属性的相同情况。
这有一个例外,那就是静态属性。静态属性是类的属性,而不是类的实例。静态属性不会被继承。静态属性如下所示:
package {
public class SuperClass {
public static var i:int = 0;
public function SuperClass():void {
}
public function doSomething():void {
trace("doing something");
}
}
SubClass类不会引用静态属性i。但是,SubClass实例可以更改SuperClass的静态值。举个例子:
package {
import SuperClass;
public class SubClass extends SuperClass {
public function SubClass():void {}
override public function doSomething():void {
trace("changing something in SuperClass");
SuperClass.i = 1;
}
}
}
现在,SuperClass的静态变量i
的值为1,而不是0.这样,SubClass有可能(尽管具有正确访问权限的任何代码具有相同的潜力) SuperClass的属性。
我希望这会有所帮助。