Home » Java Tutorial » Constructor Overloading in Java

Constructor Overloading in Java

In Java, constructors play a vital role in initializing objects when they are created. But what if you want to initialize an object in multiple ways — maybe with default values, or sometimes with custom input? That’s where Constructor Overloading comes into the picture. Constructor overloading allows you to create multiple constructors in a single class, each with different parameters. This makes your code more flexible, readable, and adaptable for different initialization scenarios.

In this blog post, we’ll learn what constructor overloading is, why it’s useful, how it works in Java, and how to implement it effectively with real-world examples.

1. What is Constructor Overloading?

Constructor Overloading means having multiple constructors in the same class with different parameter lists.

Just like method overloading, constructors can be overloaded to perform different tasks based on the type or number of parameters passed.

2. Why Use Constructor Overloading?

Constructor overloading allows flexibility when creating objects. It helps in:

  • Initializing objects in different ways.
  • Providing default values.
  • Reducing code duplication.

3. Rules for Constructor Overloading

To overload a constructor, follow these rules:

  • Constructors must have different parameter lists (number, type, or order of parameters).
  • The return type must not be specified.
  • You can use this() to call another constructor from the current constructor.

4. Examples of Constructor Overloading

Example 1: Basic Constructor Overloading

class Student {
    String name;
    int age;

    // Constructor 1: No argument
    Student() {
        name = "Unknown";
        age = 0;
    }

    // Constructor 2: One argument
    Student(String n) {
        name = n;
        age = 0;
    }

    // Constructor 3: Two arguments
    Student(String n, int a) {
        name = n;
        age = a;
    }

    void display() {
        System.out.println(name + " - " + age);
    }

    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student("Rahul");
        Student s3 = new Student("Priya", 21);

        s1.display();
        s2.display();
        s3.display();
    }
}

Output:

Unknown - 0
Rahul - 0
Priya - 21

Explanation

Class and Variables:

  • A class named Student is created.
  • It has two instance variables:
    • name → to store the student’s name.
    • age → to store the student’s age.

Constructor 1: Student()

Student() {
    name = "Unknown";
    age = 0;
}
  • This is a no-argument constructor.
  • When you create a student without providing any values, this constructor sets:
    • name = "Unknown"
    • age = 0

Constructor 2: Student(String n)

Student(String n) {
    name = n;
    age = 0;
}
  • This is a single-argument constructor.
  • It allows you to set a custom name for the student.
  • The age is still set to 0 by default.

Constructor 3: Student(String n, int a)

Student(String n, int a) {
    name = n;
    age = a;
}
  • This is a two-argument constructor.
  • It allows you to set both the name and age of the student.

The display() Method:

void display() {
    System.out.println(name + " - " + age);
}
  • This method prints the student’s name and age in the format:
    "Name - Age"

In the main() Method:

Student s1 = new Student();             // Uses Constructor 1
Student s2 = new Student("Rahul");      // Uses Constructor 2
Student s3 = new Student("Priya", 21);  // Uses Constructor 3

Each object uses a different constructor:

  • s1 → no values passed → defaults used.
  • s2 → only name is passed → custom name, default age.
  • s3 → name and age both passed → fully customized.

Example 2: Using this() to Call Other Constructors

Constructor Overloading means having multiple constructors with different parameter lists in the same class. In this example, the class Rectangle has three overloaded constructors:

class Rectangle {
    int length, width;

    Rectangle() {
        this(1, 1);  // Calls the two-arg constructor
    }

    Rectangle(int l) {
        this(l, l);  // Square: same length and width
    }

    Rectangle(int l, int w) {
        length = l;
        width = w;
    }

    int area() {
        return length * width;
    }

    public static void main(String[] args) {
        Rectangle r1 = new Rectangle();
        Rectangle r2 = new Rectangle(5);
        Rectangle r3 = new Rectangle(4, 6);

        System.out.println(r1.area());  // 1
        System.out.println(r2.area());  // 25
        System.out.println(r3.area());  // 24
    }
}

Explanation

1. No-Argument Constructor

Rectangle() {
    this(1, 1);  // calls the two-arg constructor
}
  • This constructor does not take any parameters.
  • It uses this(1, 1) to call the two-parameter constructor.
  • This sets:
    • length = 1
    • width = 1

2. One-Argument Constructor

Rectangle(int l) {
    this(l, l);  // square: same length and width
}
  • Takes only one parameter, assumes it’s a square.
  • Uses this(l, l) to call the two-argument constructor with both sides equal.

3. Two-Argument Constructor

Rectangle(int l, int w) {
    length = l;
    width = w;
}
  • This constructor initializes both length and width with custom values.
  • No call to this() — it’s the base constructor.

this() Usage Summary

  • this() is used to call another constructor from the current constructor.
  • It must be the first line in the constructor.
  • Helps in reusing initialization logic, avoiding code duplication.

How the Constructors Work in main():

Rectangle r1 = new Rectangle();       // No-arg constructor → calls Rectangle(1,1)
Rectangle r2 = new Rectangle(5);      // One-arg constructor → calls Rectangle(5,5)
Rectangle r3 = new Rectangle(4, 6);   // Two-arg constructor → sets length = 4, width = 6

Output Breakdown

System.out.println(r1.area());  // 1 * 1 = 1
System.out.println(r2.area());  // 5 * 5 = 25
System.out.println(r3.area());  // 4 * 6 = 24

5. Constructor Overloading vs Method Overloading

FeatureConstructor OverloadingMethod Overloading
PurposeInitialize objects in different waysPerform similar operations with different data
NameSame as class nameAny valid method name
Return TypeNo return typeMust have return type
Called Usingnew keyword during object creationObject reference or class name

6. Best Practices

  • Keep overloaded constructors organized for readability.
  • Use this() to avoid repeating initialization logic.
  • Provide meaningful default values in no-argument constructors.
  • Avoid too many constructors—use builder patterns in complex classes.

❓7. FAQs on Constructor Overloading

Q1. Can we overload constructors in Java?

Yes, you can overload constructors by changing the number or type of parameters.

Q2. Can constructor overloading include different access modifiers?

Yes, constructors can have different access modifiers (public, private, protected).

Q3. Can we use this() and super() in the same constructor?

No, because both must be the first statement. Only one can be used at a time.

Q4. What happens if no constructor is defined?

Java provides a default constructor automatically. Once you define any constructor, the default is not provided.

Q5. Can constructors be private?

Yes, useful in Singleton design patterns or Factory methods.

Q6. Is constructor overloading compile-time or run-time?

It is compile-time polymorphism.

Q7. Can we overload a constructor with the same parameter types but different names?

No, parameter types and order must be different, not just variable names.

Q8. Can we call an overloaded constructor from another constructor?

Yes, using the this() keyword.

Conclusion

Constructor Overloading in Java is a powerful feature that helps in object initialization with flexibility. By using it effectively, your code becomes cleaner, more organized, and adaptable for real-world scenarios.