已知以下代码片段:

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 对象调用。

总结:

在继承中,子类可以拥有与父类相同的静态变量名和方法名,它们不会发生冲突。子类中的静态变量不会覆盖父类中的静态变量,而是创建了新的静态变量。子类中的静态方法也不会覆盖父类中的静态方法,而是创建了新的静态方法。在调用静态方法或静态变量时,会根据类的类型进行判断。

Java 继承中的静态变量和方法冲突分析

原文地址: https://www.cveoy.top/t/topic/n6Ku 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录