class Car extends Vehicle {
public static void main(String [] args) {
new Car().run();
}
private final void run() {
System.out.println("Car");
}
}
class Vehicle {
private final void run() {
System.out.println("Vehicle");
}
}
这是“J2SE 5平台的SCJP考试”中的练习题 它显然回到了汽车。
但Car扩展了Vehicle并覆盖了run()。但是在超类中运行是最终的。我不认为你可以覆盖最终方法?
答案 0 :(得分:1)
秘密在于private
修饰符。 JLS 8.4.3.3. final Methods
私有方法和在最终类(第8.1.1.2节)中立即声明的所有方法的行为就像它们是最终的一样,因为不可能覆盖它们。
私有方法在其自身外的任何地方都不可见,因此无法覆盖。
他们碰巧有相同的名字,但他们不会分享任何东西。
如果您在源代码中扩展一个您不知道的类,这种行为也很有意义。你需要知道你看不到的所有私人方法签名,这样你就不会意外地覆盖和破坏它们。
答案 1 :(得分:0)
重要的是要注意。
private final void run() {
System.out.println("Car");
}
private可以在Car类中访问,而在Vehicle类中,您已声明方法为final。 Final是一个关键字,您无法覆盖其他类,但是如果您为Vehicle创建对象引用。因此newCar()。run()将访问将输出打印为“Car”。这里覆盖概念将不适用。