Home > Net >  Why does the call to a parent class constructor not call the parent's methods that are override
Why does the call to a parent class constructor not call the parent's methods that are override

Time:08-28

As shown in the code below, given a superclass Parent with a method calculate() that is called in Parent's constructor, but also overriden in the class Child, why does the implicit call to Parent's constructor within Child's constructor not call Parent's calculate() instead of Child's calculate()?

class Parent {
    Parent() {
        calculate();
        System.out.println("Empty parent ctor.");
    }
    void calculate() {
        System.out.println("Parent calculating...");
    }
}

class Child extends Parent {
    Child() {
        System.out.println("Empty child ctor.");
    }
    @Override
    void calculate() {
        System.out.println("Child calculating...");
    }
}

public class ParentConstructor {
    public static void main(String [] args) {
        Parent child = new Child();
    }
}

Output:

Child calculating...
Empty parent ctor.
Empty child ctor.

I would have thought that to correctly construct a Parent object, its constructor should always be called with its own method definitions?

CodePudding user response:

The method in the parent will never be called by a child or subclass that overrides the method unless you explicitly call it with the super statement. That is because during a method call, which method(parent class or child class) is to be executed is determined by the object type.

This process in which a call to the overridden method is resolved at runtime is known as dynamic method dispatch.

class Child extends Parent {
    Child() {
        System.out.println("Empty child ctor.");
    }
    @Override
    void calculate() {
        super.calculate(); // calling parent implementation
        System.out.println("Child calculating...");
    }
}

CodePudding user response:

I would have thought that to correctly construct a Parent object, its constructor should always be called with its own method definitions?

No. It is assumed that if you permit a method to be overridden, and choose to override the method, that the overridden behavior is the right one.

(Methods to prevent this overriding including marking your method final or private.)

  • Related