面试题答案
一键面试访问规则
- 静态属性:子类可以通过
类名.静态属性
的方式访问父类的静态属性,因为静态属性属于类本身,而不是类的实例。例如,在B
子类中,可以通过A.静态属性名
访问父类A
的静态属性。 - 静态方法:子类同样可以通过
类名.静态方法名
的方式调用父类的静态方法,即A.静态方法名()
。
重写静态方法
在 TypeScript 中,静态方法不能像实例方法那样被直接重写。虽然语法上可以在子类中定义与父类相同签名的静态方法,但这并不是真正意义上的重写。因为静态方法属于类本身,而不是实例,不同类的静态方法是相互独立的。
代码示例
class A {
// 静态属性
static staticProperty: string = '父类静态属性';
// 静态方法
static staticMethod(): void {
console.log('父类静态方法');
}
}
class B extends A {
// 尝试 “重写” 静态方法
static staticMethod(): void {
console.log('子类 “重写” 的静态方法');
}
}
// 访问父类静态属性
console.log(A.staticProperty);
// 调用父类静态方法
A.staticMethod();
// 访问子类 “重写” 的静态方法
console.log(B.staticProperty);
B.staticMethod();
原理解释
- 静态成员属于类:静态属性和静态方法是与类本身关联,而不是与类的实例关联。所以,无论是父类还是子类,它们访问静态成员都是通过类名进行。
- “重写” 的假象:在上述代码中,子类
B
定义了与父类A
相同签名的静态方法staticMethod
。但这两个方法是相互独立的,分别属于A
类和B
类。当通过A.staticMethod()
调用时,执行的是父类的方法;通过B.staticMethod()
调用时,执行的是子类定义的方法。这与实例方法的重写概念不同,实例方法重写是基于对象的多态性,根据对象的实际类型来决定执行哪个重写版本的方法,而静态方法不具备这种基于实例的多态特性。