DEV Community

gaurbprajapati
gaurbprajapati

Posted on

Constructor Behavior in Inheritance

In inheritance, constructors are not automatically inherited from the parent class to the child class. However, if the child class doesn't define its own constructor, it will inherit the constructor from the parent class. If the child class defines its own constructor, it can choose to explicitly call the parent class constructor using the super keyword.

Keep in mind that constructors can be chained together using super to ensure proper initialization of attributes and to avoid code duplication. It's important to consider constructor chaining when designing class hierarchies to ensure that all necessary initialization steps are performed.

Constructor behavior in inheritance involves how constructors are inherited and called within a class hierarchy. Let's explore the different aspects of constructor behavior in inheritance through various code examples.

1. Inherited Constructors:

When a child class doesn't define its own constructor, it inherits the constructor from the parent class. Here's an example:

class Parent:
    def __init__(self):
        print("Parent constructor")

class Child(Parent):
    pass

child_obj = Child()  # Output: Parent constructor
Enter fullscreen mode Exit fullscreen mode
class Parent {
    Parent() {
        System.out.println("Parent constructor");
    }
}

class Child extends Parent {
    public static void main(String[] args) {
        Child childObj = new Child();  // Output: Parent constructor
    }
}
Enter fullscreen mode Exit fullscreen mode

In this example, the Child class doesn't have its own constructor, so it inherits the constructor of the Parent class.

2. Overriding Constructors:

Child classes can override constructors inherited from parent classes. This means that if the child class defines its own constructor, it will replace the inherited constructor.

class Parent:
    def __init__(self):
        print("Parent constructor")

class Child(Parent):
    def __init__(self):
        print("Child constructor")

child_obj = Child()  # Output: Child constructor
Enter fullscreen mode Exit fullscreen mode
class Parent {
    Parent() {
        System.out.println("Parent constructor");
    }
}

class Child extends Parent {
    Child() {
        System.out.println("Child constructor");
    }

    public static void main(String[] args) {
        Child childObj = new Child();  // Output: Child constructor
    }
}
Enter fullscreen mode Exit fullscreen mode

In this case, the Child class defines its own constructor, so it overrides the constructor inherited from the Parent class.

3. Calling Parent Class Constructor using super:

When a child class defines its own constructor and wants to utilize the initialization code from the parent class's constructor, it can use the super keyword.

class Parent:
    def __init__(self):
        print("Parent constructor")

class Child(Parent):
    def __init__(self):
        super().__init__()  # Calling parent constructor
        print("Child constructor")

child_obj = Child()
# Output:
# Parent constructor
# Child constructor
Enter fullscreen mode Exit fullscreen mode
class Parent {
    Parent() {
        System.out.println("Parent constructor");
    }
}

class Child extends Parent {
    Child() {
        super();  // Calling parent constructor
        System.out.println("Child constructor");
    }

    public static void main(String[] args) {
        Child childObj = new Child();
        // Output:
        // Parent constructor
        // Child constructor
    }
}
Enter fullscreen mode Exit fullscreen mode

In this example, the Child class's constructor calls the Parent class's constructor using super().__init__(). This allows both the parent and child constructors to execute.

4. Constructor Chaining:

When there is a chain of inheritance involving multiple levels of classes, each constructor in the hierarchy can be chained together using the super keyword to ensure proper initialization.

class Grandparent:
    def __init__(self):
        print("Grandparent constructor")

class Parent(Grandparent):
    def __init__(self):
        super().__init__()
        print("Parent constructor")

class Child(Parent):
    def __init__(self):
        super().__init__()
        print("Child constructor")

child_obj = Child()
# Output:
# Grandparent constructor
# Parent constructor
# Child constructor
Enter fullscreen mode Exit fullscreen mode

In Java, if a child class doesn't explicitly define its own constructor, it automatically inherits the default no-argument constructor from the parent class. However, if the parent class defines parameterized constructors, the child class doesn't automatically inherit them. You can manually call a parent constructor using the super() keyword within the child class's constructor.

class Parent {
    Parent() {
        System.out.println("Parent constructor");
    }

    Parent(int x) {
        System.out.println("Parent parameterized constructor");
    }
}

class Child extends Parent {
    // Child class doesn't define its own constructors
}

public class Main {
    public static void main(String[] args) {
        Child child1 = new Child();         // Output: Parent constructor
        Child child2 = new Child(10);       // Compile error (no matching constructor)
    }
}

Enter fullscreen mode Exit fullscreen mode

To fix the error and pass a value to the parent constructor in the Child class, you need to create a constructor in the Child class that explicitly calls the parent class constructor using the super() keyword. Here's how you can do it:

class Parent {
    Parent() {
        System.out.println("Parent constructor");
    }

    Parent(int x) {
        System.out.println("Parent parameterized constructor: " + x);
    }
}

class Child extends Parent {
    Child() {
        super();  // Calling the no-argument parent constructor
    }

    Child(int x) {
        super(x); // Calling the parameterized parent constructor
    }
}

public class Main {
    public static void main(String[] args) {
        Child child1 = new Child();         // Output: Parent constructor
        Child child2 = new Child(10);       // Output: Parent parameterized constructor: 10
    }
}
Enter fullscreen mode Exit fullscreen mode

In this example, the constructors of Grandparent, Parent, and Child classes are chained together using the super keyword. This ensures that the constructors are called in the proper order.

In summary, constructor behavior in inheritance includes inheritance, calling parent class constructors using super, and chaining constructors for multi-level hierarchies. Understanding these concepts is crucial for effective class design and proper initialization in complex class hierarchies.

Top comments (3)

Collapse
 
cicirello profile image
Vincent A. Cicirello

In Java, classes do not inherit constructors from their superclass. The reason your child class in that example has a no-parameter constructor is that Java auto-generates one for you if you don't define any other constructor. And the constructor it generates for you calls the no-parameter constructor of the superclass, which is why you get the output that you get in that example.

Also, in Java, you cannot override a constructor. Although a child class can have a constructor with same parameters as the superclass, it is not overriding it. Actually, the output that example will priduce is not what you claim it to be. If you don't explicitly call a superclass constructor from the constructor of a subclass, Java automatically calls the no-parameter constructor of the superclass for you if it exists. If it doesn't exist, you get a syntax error. In your example it exists so it will be called. In your example, you should see the result of the superclass constructor first and then the child class just like in your example where you explicitly called it. For Java, those 2 examples are functionally equivalent.

Collapse
 
gaurbprajapati profile image
gaurbprajapati

yes you are correct , that my mistake Thanks for pointing out

In Java, if a child class doesn't explicitly define its own constructor, it automatically inherits the default no-argument constructor from the parent class. However, if the parent class defines parameterized constructors, the child class doesn't automatically inherit them. You can manually call a parent constructor using the super() keyword within the child class's constructor.

Collapse
 
cicirello profile image
Vincent A. Cicirello

Even in that case, it doesn't inherit the default no-parameter constructor. In Java, constructors are never inherited. There are 2 things going on in that case. If a class doesn't explicitly define a constructor, the Java compiler generates a default constructor for you that simply calls super(). The second thing is that if you do define a constructor but don't explicitly call a superclass constructor, the Java compiler inserts a call to super() in the bytecode that it generates.