【问题标题】:How static method inheritance and static variable inheritance differs?静态方法继承和静态变量继承有何不同?
【发布时间】:2017-02-07 21:24:54
【问题描述】:

我在使用 java 中的覆盖功能时遇到了疑问。

考虑下面的代码:

class Vehicle {
    static int speed = 50;

    public static void display() {
        System.out.println(speed);
    }
}

class Jeep extends Vehicle {
    int speed = 100;

    void display() {    //GETTING COMPILE TIME ERROR
        System.out.println(speed);//will print speed of Bike   
    }

    public static void main(String args[]) {
        Jeep b = new Jeep ();
        System.out.println(b.speed);

    }
}

我读到静态方法不能被覆盖。

但在上面的代码中,我在父类 Vehicle 中声明了一个静态变量“速度”。我在子类中创建了一个同名“速度”的实例变量。当我更改子类中静态变量“速度”的值时,我没有收到任何编译时错误。

我在尝试覆盖显示方法时遇到编译时问题,而在重新声明变量“速度”时我没有收到任何错误,即使两者在父类中都是静态的。

可能是什么原因,子类的speed 变量隐藏了父类的静态speed 变量,而display 方法却没有这样做并显示编译时错误?

【问题讨论】:

标签: java oop inheritance static overriding


【解决方案1】:

static 函数不是对象的特定实例的一部分,除非将其应用于对象,否则多态并没有多大意义。

这就是为什么您不能覆盖 static 函数的原因。

【讨论】:

    【解决方案2】:

    在您的代码中,子类定义了一个具有相同名称(速度)的字段,该字段被声明为一个新字段,并且超类中的字段被隐藏,或者换句话说,被具有相同名称的子类字段隐藏。

    阴影字段表示它没有被子类继承,而是子类在其范围内声明了一个同名的字段。

    隐藏字段不会影响其在超类中的值。要访问隐藏字段,只需使用 super.fieldname(在您的情况下为 Vehicle.speed,因为它是静态的)。

    字段不能被覆盖,只能在java中隐藏。

    字段的阴影被许多人认为是不好的做法,因为它降低了代码的可读性和混乱度。

    至于为什么不能覆盖静态字段,Bathsheba 在您的问题帖子或参考中提供了很好的答案 Why doesn't Java allow overriding of static methods?

    【讨论】:

      猜你喜欢
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2012-07-17
      • 2012-06-21
      • 2015-03-20
      • 2011-02-13
      • 2016-09-10
      相关资源
      最近更新 更多