MST
星途 面试题库

面试题:TypeScript 类静态成员与实例成员在继承场景下的表现差异

假设有一个父类 `ParentClass` 包含静态成员 `staticValue` 和实例成员 `instanceValue`,创建一个子类 `ChildClass` 继承自 `ParentClass`。请说明在子类实例化对象和直接访问子类静态成员时,对 `staticValue` 和 `instanceValue` 的访问情况及原理,并用代码示例展示。
32.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 访问情况及原理
    • staticValue
      • 静态成员属于类,而不属于类的实例。当子类实例化对象时,子类对象可以访问从父类继承而来的静态成员staticValue。因为静态成员在内存中只有一份,被所有该类及其子类的实例共享。当直接访问子类静态成员时,同样可以访问到父类的staticValue,原理也是因为静态成员的共享性。
    • instanceValue
      • 实例成员属于类的实例。当子类实例化对象时,子类对象可以访问从父类继承而来的实例成员instanceValue,因为子类对象包含了从父类继承的所有实例成员。而直接访问子类静态成员时,不能直接访问instanceValue,因为静态成员方法或直接访问静态成员的环境中,没有具体的实例,而instanceValue需要通过具体的实例来访问。
  2. 代码示例(以Java为例)
class ParentClass {
    static int staticValue = 10;
    int instanceValue = 20;
}

class ChildClass extends ParentClass {
}

public class Main {
    public static void main(String[] args) {
        // 子类实例化对象访问
        ChildClass child = new ChildClass();
        System.out.println("子类实例访问staticValue: " + child.staticValue);
        System.out.println("子类实例访问instanceValue: " + child.instanceValue);

        // 直接访问子类静态成员
        System.out.println("直接访问子类静态成员staticValue: " + ChildClass.staticValue);
        // 下面这行代码会报错,因为不能在静态环境中直接访问实例成员
        // System.out.println("直接访问子类静态成员时访问instanceValue: " + ChildClass.instanceValue);
    }
}

在Python中,虽然没有严格意义上的静态成员概念,但通过@classmethod和类变量可以模拟类似效果,代码如下:

class ParentClass:
    staticValue = 10
    def __init__(self):
        self.instanceValue = 20

class ChildClass(ParentClass):
    pass

# 子类实例化对象访问
child = ChildClass()
print("子类实例访问staticValue:", child.staticValue)
print("子类实例访问instanceValue:", child.instanceValue)

# 直接访问子类静态成员
print("直接访问子类静态成员staticValue:", ChildClass.staticValue)
# 下面这行代码会报错,因为不能在没有实例的情况下访问instanceValue
# print("直接访问子类静态成员时访问instanceValue:", ChildClass.instanceValue)