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考试”中的一个练习题,它显然还车。
但是汽车扩展了车辆,覆盖了run()。但是在超类中运行是最终结果。我不认为你能推翻最终的方法?
发布于 2013-12-03 02:39:43
秘密在于private修饰符。JLS 8.4.3.3.最终方法
私有方法和在最终类中立即声明的所有方法(§8.1.1.2)表现得好像它们是最终的,因为不可能覆盖它们。
私有方法在自身之外的任何地方都是不可见的,因此不能被重写。
他们只是碰巧有相同的名字,但他们没有分享任何以外的东西。
如果扩展源代码中不知道的类,这种行为也很有意义。您需要知道所有您看不到的私有方法签名,这样您就不会意外地覆盖和破坏它们。
发布于 2013-12-03 02:39:51
重要的是要注意。
private final void run() {
System.out.println("Car");
}可以在Car类中访问私有类,而在Vehicle类中,您已经将方法声明为final。Final是一个关键字,您不能覆盖到其他类,但是如果您为Vehicle创建一个对象引用。因此,newCar().run()将以"Car“的形式打印输出。在这里,覆盖概念将不适用。
https://stackoverflow.com/questions/20341714
复制相似问题