静态方法继承和静态变量继承有何不同?

时间:2016-09-29 13:51:07

标签: java oop inheritance static override

我在浏览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);

    }
}

我读到静态方法无法覆盖。

但是在上面的代码中,我宣布了一个静态变量' speed'在父类车辆。我创建了一个名称相同的实例变量' speed'在儿童班。我没有得到任何编译时错误,因为我更改了静态变量的速度' speed'在儿童班。

我在尝试覆盖显示方法时面临编译时问题,而在重新声明变量' speed'时我没有收到任何错误。尽管两者在父类中都是静态的。

可能是因为子类的speed变量隐藏了父类的静态speed变量,但却没有对display执行相同的操作。方法并显示编译时错误?

2 个答案:

答案 0 :(得分:3)

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

这就是为什么你不能覆盖static函数。

答案 1 :(得分:1)

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

阴影字段表示它不是由子类继承的,而是子类声明了其范围内具有相同名称的字段。

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

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

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

至于为什么静态字段不能被覆盖Bathsheba在你的问题帖子或推荐上提供了一个很好的答案 Why doesn't Java allow overriding of static methods?