面试题答案
一键面试- 访问情况及原理:
staticValue
:- 静态成员属于类,而不属于类的实例。当子类实例化对象时,子类对象可以访问从父类继承而来的静态成员
staticValue
。因为静态成员在内存中只有一份,被所有该类及其子类的实例共享。当直接访问子类静态成员时,同样可以访问到父类的staticValue
,原理也是因为静态成员的共享性。
- 静态成员属于类,而不属于类的实例。当子类实例化对象时,子类对象可以访问从父类继承而来的静态成员
instanceValue
:- 实例成员属于类的实例。当子类实例化对象时,子类对象可以访问从父类继承而来的实例成员
instanceValue
,因为子类对象包含了从父类继承的所有实例成员。而直接访问子类静态成员时,不能直接访问instanceValue
,因为静态成员方法或直接访问静态成员的环境中,没有具体的实例,而instanceValue
需要通过具体的实例来访问。
- 实例成员属于类的实例。当子类实例化对象时,子类对象可以访问从父类继承而来的实例成员
- 代码示例(以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)