java覆盖方法调用

时间:2012-02-15 09:08:20

标签: java methods override

我有一个超级班:

public class SuperClass {

    public void dosomething() {
        firstMethod();
        secondMethod();
    }

    public void firstMethod() {
        System.out.println("Super first method");
    }

    public void secondMethod() {
        System.out.println("Super second method");
    }
}

子类:

public class SubClass extends SuperClass {

    public void dosomething() {
        super.dosomething();
    }

    public void firstMethod() {
        System.out.println("Sub first method");
    }

    public void secondMethod() {
        System.out.println("Sub second method");
    }
}

测试类:

public static void main(String[] args) {
      SubClass sub = new SubClass();
      sub.dosomething();
      SuperClass sup = new SuperClass();
      sup.dosomething()
}

当我运行测试方法时,我得到了这个:

Sub first method
Sub second method
你能告诉我这是怎么发生的吗?在子类dosomething方法中,我调用了super.dosomething(),我认为将调用super方法,但是调用了子类中的override方法。

如果我这样做:
SuperClass superClass = new SuperClass();
superClass.dosomething();


结果是:
超级第一种方法
超级第二种方法

区别在于方法调用的地方。我认为必须有一些我不知道的东西:

oops!超级引用指向第一个示例中的子类...

像这样:

SuperClass sub = new SubClass();
sub.firstMethod();
sub.secondMethod();

4 个答案:

答案 0 :(得分:3)

在java中,方法binding总是dynamic [忽略静态和私有方法]。因此,当您重写firstMethod()secondMethod()时,只要SubClass类型的对象尝试调用其中一个对象,就会调用overriden方法 - 即使它[invokation]也是如此来自父母的方法。

因此,正如预期的那样 - 当您调用super.doSomething()时,它会调用firstMethod()secondMethod(),并且正在调用覆盖方法。

答案 1 :(得分:1)

实际上,{p> Super.dosomething()会调用dosomething()类中的方法Super。但在此方法中,您调用{strong> 2 函数firstMethodsecondMethod。这些方法在Sub类中被覆盖,它们是从Sub类调用的。

Petar Ivanov 建议:

  

如果你最后标记

,你可以阻止它们被覆盖

答案 2 :(得分:1)

确实超级doSomething被调用了。做一些事情调用firstMethod和secondMethod,它们是虚方法(Java中的任何方法默认都是虚拟的,这意味着它可以被覆盖)。因此他们的覆盖版本被调用。

如果你最后标记它们,你可以防止它们被覆盖。

答案 3 :(得分:1)

调用方法的对象是SubClass类型,而不是SuperClass。即使您调用仅在SuperClass中定义的方法,您的执行上下文仍然是SubClass。因此,被覆盖的任何被调用的方法实际上都会执行重写的方法。

从中可以看出,通过将firstMethod和secondMethod声明为public,SuperClass实际上允许子类覆盖它们的行为。如果这不合适,方法应该是私有的,或者是最终的。