【问题标题】:Call the method of base Class which was over ridden调用被覆盖的基类方法
【发布时间】:2012-09-15 15:06:25
【问题描述】:

我在这个例子中说明了我的问题

class Car {
    public void start(){
        System.out.println("Car Started!!!");
    }
}

class Mercedes extends Car {
    public void start(){
        System.out.println("Mercedes Started!!!");
    }
}

现在,在我的主程序中,我写

Mercedes m = new Mercedes();
m.start();

它打印:Mercedes Started!!!

如何使用同一个对象调用Car类的start()方法,这样输出就可以了

汽车启动了!!!.

编辑

其实这是在我参加的一次采访中被问到的。我给出了 super 关键字答案。但面试官否认了。他说他会给我一个提示并说虚拟功能。我不知道如何使用该提示。

【问题讨论】:

  • 虚拟功能?在 Java 中,默认情况下,所有非静态方法都是虚函数,除非它们是 finalprivate(或包私有作为边缘情况。)
  • 我猜面试官试图欺骗我来了解我如何处理这种情况
  • 虚函数是一个函数,它的行为可以在继承类中被具有相同签名的函数覆盖,我猜大多数解决方案都使用这个属性。

标签: java inheritance


【解决方案1】:

您的方法应该像调用超级实现一样。

public void start(){
    super.start();
    System.out.println("Mercedes Started!!!");
}

或者它没有。在这种情况下,您是说您已经替换了父级的实现。

虽然这不是一个好主意,但您可以通过添加一个方法来解决这个问题。

public void startCar(){
    super.start();
}

【讨论】:

    【解决方案2】:

    该方法已在子类中覆盖,因此它有效地替换了超类中的方法。

    子类本身可以调用超类中的方法:

    class Mercedes extends Car {
      public void startFromCar() {
        super.start();
      }
      public void start(){
        System.out.println("Mercedes Started!!!");
      }
    }
    

    【讨论】:

    • 是啊有没有办法调用被覆盖的方法?
    • 在不改变子类定义的情况下,我不能调用被覆盖的方法吗
    • 其实在我参加的一次采访中被问到。我给出了你给出的答案。但面试官否认了。他说他会给我一个提示并说Virtual Function。我不知道如何使用该提示
    【解决方案3】:

    您必须向Mercedes 类添加另一个方法来调用超类的start 方法:

    public void superStart() { super.start(); }
    

    super 关键字允许您访问要继承的类(超类)。更多相关信息here

    【讨论】:

      【解决方案4】:

      关键字super

      class Car {
          public void start(){
              System.out.println("Car Started!!!");
          }
      }
      class Mercedes extends Car {
          public void start(){
              super.start();
          }
      }
      

      编辑:

      class Car {
          public void start(){
              System.out.println("Car Started!!!");
          }
      }
      class Mercedes extends Car {
      }
      

      现在,如果您致电 new Mercedes().start();,“汽车已启动!!!”被打印出来了。

      【讨论】:

      • 这种情况下,可以删除Mercedes.start()方法;)
      • 我想在不改变子类定义的情况下调用被覆盖的方法
      • Abhijith Venkata:然后只继承它并让多态性做正确的事情
      【解决方案5】:

      您在子类中覆盖了父类的方法。 要访问此类方法,请使用 super 关键字。

      变化很大

      class Mercedes extends Car {
      public void start(){
          System.out.println("Mercedes Started!!!");
      }
      
      }
      

      class Mercedes extends Car {
      public void start(){
          super.start();
          System.out.println("Mercedes Started!!!");
      }
      
      }
      

      将打印

      Car Started!!!
      Mercedes Started!!!
      

      或者如果您想单独访问而不更改给定函数,请尝试在Mercedes 类中定义一个新方法。

      public void startCar(){
          super.start();
      }
      

      调用此函数将达到您的目的。

      【讨论】:

        【解决方案6】:

        还有一个选择

        class Car {
            public void start(){
                System.out.println("Car Started!!!");
            }
         }
         Class Mercedes extends Car {
            //nothing here
         }
        

        然后调用

        Mercedes m = new Mercedes();
        m.start();
        

        将打印:

        汽车启动!!!

        如果你想要一个类似于梅赛德斯的对象打印其他东西而不是汽车启动!!! 它应该是这样的

            class AlfaRomeo extends Car {.
                @override
                public void start(){
                System.out.println("Car Started!!!");  
                System.out.println("Its AlfaRomeo!!!");
                }
            }
        

        @override 告诉 java 使用子方法而不是父方法。

        AlfaRomeo a = new AlfaRomeo();
         a.start();
        

        所以打印结果是:

        汽车启动!!!

        它的阿尔法罗密欧!!!

        【讨论】:

          猜你喜欢
          • 2011-12-13
          • 1970-01-01
          • 1970-01-01
          • 2013-03-03
          • 1970-01-01
          • 2010-10-18
          • 2011-11-03
          • 2014-05-22
          • 1970-01-01
          相关资源
          最近更新 更多