覆盖run方法

时间:2013-12-03 02:26:55

标签: java

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()。但是在超类中运行是最终的。我不认为你可以覆盖最终方法?

2 个答案:

答案 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”。这里覆盖概念将不适用。