Java 继承中的静态变量和方法冲突分析
已知以下代码片段:
class A {
public static int v = 1;
public void fn() {
// 方法体
}
}
class B extends A {
public static int v = 2;
public void fn() {
// 方法体
}
public void fn1() {
// 方法体
}
}
下列说法正确的是()
A. 类 B 中的 fn 与类 A 中的 fn 冲突了,会报错 B. 类 B 中的 v 和类 A 中的 v 冲突了,会报错 C. A a = new B(); a.fn1() 调用会报错 D. A a = new B(); a.v 的值是 2
正确答案:D
解析:
- 静态变量: 类 B 中的
v和类 A 中的v并没有冲突。静态变量属于类,而不是对象,每个类都有自己的静态变量。子类中的静态变量不会覆盖父类的静态变量,而是创建了新的静态变量。因此,A.v的值为 1,B.v的值为 2。 - 静态方法: 类 B 中的
fn并没有覆盖类 A 中的fn。在调用fn方法时,会根据对象的类型进行判断,a对象的类型是B,因此会调用B.fn()。 - 实例方法: 类 B 中的
fn1是实例方法,可以通过a对象调用。
总结:
在继承中,子类可以拥有与父类相同的静态变量名和方法名,它们不会发生冲突。子类中的静态变量不会覆盖父类中的静态变量,而是创建了新的静态变量。子类中的静态方法也不会覆盖父类中的静态方法,而是创建了新的静态方法。在调用静态方法或静态变量时,会根据类的类型进行判断。
原文地址: https://www.cveoy.top/t/topic/n6Ku 著作权归作者所有。请勿转载和采集!