【问题标题】:Clarity with method overriding方法覆盖的清晰性
【发布时间】:2012-03-15 11:40:43
【问题描述】:

很好奇重写方法和重写方法的正确定义。 在我的理解中,覆盖方法是子类中的方法,它覆盖了基类中具有相同签名和返回类型的方法。

然而,我看到消息来源将被覆盖的方法称为子类中的方法,它会覆盖基类中的方法。

那么哪个是覆盖方法,哪个是覆盖方法?

对不起,如果这是一个有点愚蠢的问题

【问题讨论】:

  • 别忘了接受一个答案作为正确答案! :-)

标签: java overriding


【解决方案1】:

假设我们有一个class SubClass extends SuperClass,那么:

SuperClass#method   <- overridden
          ^
          |
       overrides
          |
  SubClass#method   <- overriding

除此之外,wikipedia 告诉我们:

子类中的实现通过提供与父类中的方法具有相同名称、相同参数或签名以及相同返回类型的方法来覆盖(替换)超类中的实现。

【讨论】:

    【解决方案2】:
    class A {
        public void method() {
            System.out.println("I don't know if I am overriden, but I'm not overriding anything");
        }
    }
    class B extends A {
        public void method() {
            System.out.println("I am overriding A.method() which has now been overriden");
        }
    }
    

    您还可以阅读JLS 中描述覆盖、实现、隐藏、重载等的部分,以获得更深入的理解。

    【讨论】:

      【解决方案3】:

      来自Java Documentation 的直接示例:

      public class Animal {
          public static void testClassMethod() {
              System.out.println("The class" + " method in Animal.");
          }
          public void testInstanceMethod() {
              System.out.println("The instance " + " method in Animal.");
          }
      }
      
      
      
      public class Cat extends Animal {
          public static void testClassMethod() {
              System.out.println("The class method" + " in Cat.");
          }
          public void testInstanceMethod() {
              System.out.println("The instance method" + " in Cat.");
          }
      
          public static void main(String[] args) {
              Cat myCat = new Cat();
              Animal myAnimal = myCat;
              Animal.testClassMethod();
              myAnimal.testInstanceMethod();
          }
      }
      

      我使用这个例子的原因是,从你的真实情况看场景。 Animal 可能具有某些一般功能。但是 Cat 将具有一些与通用 Animal 不同的功能,但某些功能是对通用 Animal 功能的改进。因此,Cat 似乎覆盖(将包含覆盖方法)Animal 功能。

      另一个简单的例子,如果您对汽车感兴趣。比如说,有一个 Car 。它将有一个acceleration 方法。但是Ferrari 显然比Car 有更好的acceleration。但是,FerrariCar。所以,Ferrari 覆盖了Car 中的一个方法。所以,重写方法在子类中,重写方法在基类中。

      那么,你现在明白了吗?覆盖方法存在于子类中。但是被覆盖的方法存在于基类中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-25
        • 2010-09-27
        • 2013-03-24
        • 2019-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        相关资源
        最近更新 更多