我在浏览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
执行相同的操作。方法并显示编译时错误?
答案 0 :(得分:3)
static
函数不是对象的特定实例的一部分,并且除非将其应用于对象,否则多态性实际上没有多大意义。
这就是为什么你不能覆盖static
函数。
答案 1 :(得分:1)
在您的代码中,子类定义了一个具有相同名称(速度)的字段,该字段被声明为新字段,并且超类中的字段被隐藏,或者换句话说,被具有相同名称的子类字段遮蔽。
阴影字段表示它不是由子类继承的,而是子类声明了其范围内具有相同名称的字段。
隐藏字段不会影响其在超类中的值。要访问隐藏字段,只需使用super.fieldname(在您的情况下为Vehicle.speed,因为它的静态)。
字段不能被覆盖,只能隐藏在java中。
字段的阴影被许多人认为是不好的做法,因为它使代码的可读性和混淆性降低。
至于为什么静态字段不能被覆盖Bathsheba在你的问题帖子或推荐上提供了一个很好的答案 Why doesn't Java allow overriding of static methods?