有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重写run方法

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");
     }
 }

这是“J2SE5平台SCJP考试”中的一道练习题 它显然还车

但Car扩展了车辆并超越了run()。但磨合超类是最终的。我不认为你可以推翻最后的方法


共 (2) 个答案

  1. # 1 楼答案

    秘密在于private修饰符JLS 8.4.3.3. final Methods

    A private method and all methods declared immediately within a final class (§8.1.1.2) behave as if they are final, since it is impossible to override them.

    私有方法在其自身之外的任何地方都不可见,因此不能被重写

    他们只是碰巧有着相同的名字,但除了名字之外,他们什么都没有

    如果您扩展了一个在源代码中不知道的类,这种行为也很有意义。你需要知道所有你看不到的私有方法签名,这样你就不会意外地重写和破坏它们

  2. # 2 楼答案

    值得注意的是

     private final void run() {
         System.out.println("Car");
     }
    

    private可以在Car类中访问,也可以在您声明方法为final的车辆类中访问。Final是一个关键字,如果您为车辆创建对象引用,则不能覆盖到其他类。所以新车()。run()将访问输出打印为“Car”。在这里,覆盖概念将不适用