Java Constructor Explained – Default, Parameterized, and Copy Constructors with Examples

Illustration for Java Constructor Explained – Default, Parameterized, and Copy Constructors with Examples
By Last updated:

Introduction

In the world of Object-Oriented Programming (OOP), constructors play a vital role in object creation and initialization. In Java, constructors are special methods used to set up newly created objects. They help ensure that every object starts with a valid and predictable state.

Whether you're a Java beginner or an experienced developer brushing up on fundamentals, understanding constructors—and their types—is key to writing robust, reusable code. In this tutorial, we'll explore default, parameterized, and copy constructors in Java, complete with examples, syntax, best practices, and real-world insights.


What Is a Constructor in Java?

Definition

A constructor is a special method in Java that is automatically called when an object is created. It has the same name as the class and no return type.

class Car {
    Car() {
        System.out.println("Constructor called!");
    }
}

Key Characteristics

  • Same name as the class
  • No return type (not even void)
  • Can be overloaded (multiple constructors with different parameters)
  • Called automatically when an object is created

Why Constructors Matter in Java

Constructors help:

  • Enforce mandatory fields on object creation
  • Prevent invalid object states
  • Set default values for properties
  • Overload creation logic for flexibility

1. Default Constructor

Definition

A default constructor is one with no parameters. If you don’t explicitly define any constructor, Java provides a no-argument default constructor behind the scenes.

Syntax

class Bike {
    Bike() {
        System.out.println("Default constructor called!");
    }
}

Java Behavior

  • Automatically generated only if no other constructor is defined.
  • If any constructor is defined, Java does not add a default one.

Use Case

public class Main {
    public static void main(String[] args) {
        Bike myBike = new Bike(); // Calls default constructor
    }
}

2. Parameterized Constructor

Definition

A parameterized constructor accepts arguments to initialize object fields with specific values.

Syntax

class Student {
    String name;
    int age;

    Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Use Case

public class Main {
    public static void main(String[] args) {
        Student s1 = new Student("Alice", 20);
        System.out.println(s1.name + ", " + s1.age);
    }
}

3. Copy Constructor

Definition

A copy constructor creates a new object by copying values from another object of the same class.

Syntax

class Book {
    String title;

    Book(String title) {
        this.title = title;
    }

    // Copy constructor
    Book(Book b) {
        this.title = b.title;
    }
}

Use Case

public class Main {
    public static void main(String[] args) {
        Book original = new Book("Java Basics");
        Book copy = new Book(original);
        System.out.println(copy.title);
    }
}

UML-Style Class Overview

Class: Student
|-- -name: String
|-- -age: int
|-- +Student(): Constructor (Default)
|-- +Student(name: String, age: int): Constructor (Parameterized)
|-- +Student(Student s): Constructor (Copy)

Real-World Analogy

Think of a constructor as the setup process when you buy a new laptop. You might buy it pre-configured (default), customize it during order (parameterized), or clone your old setup onto the new one (copy).


Refactoring Example

Without Constructors

class Person {
    String name;
    int age;
}

Person p = new Person();
p.name = "John";
p.age = 30;

With Constructors

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Person p = new Person("John", 30);

Java Constructor Behavior and Edge Cases

  • Constructors are not inherited
  • Can be overloaded (but not overridden)
  • Use this() to call another constructor from the same class
  • Use super() to call a constructor from the parent class
  • If no constructor is defined, Java adds a public default constructor
  • Java 21+ supports compact constructors via records

Example: Constructor Chaining

class Example {
    Example() {
        this("Hello");
    }

    Example(String message) {
        System.out.println("Message: " + message);
    }
}

Best Practices

  • Always define at least one constructor explicitly.
  • Use constructor overloading to increase flexibility.
  • Validate inputs within constructors.
  • Avoid long parameter lists—use Builder pattern if needed.
  • Prefer immutability for data objects (e.g., records).

Java 17/21 Notes

Records (Java 16+)

record User(String name, int age) {}

Records come with an implicit constructor, ideal for data classes.

Sealed Classes

Constructors help restrict subclass behavior when using sealed hierarchies.

sealed class Shape permits Circle, Square {}

final class Circle extends Shape {
    Circle() {
        super();
    }
}

Pros and Cons

✅ Pros

  • Controlled object initialization
  • Supports constructor overloading for flexibility
  • Promotes code reusability and maintainability

❌ Cons

  • Too many constructor variants can become hard to manage
  • Cannot be inherited; every subclass must define its own

Conclusion

Constructors in Java are the foundation of safe, efficient object creation. Understanding the difference between default, parameterized, and copy constructors allows developers to write clean, extensible, and bug-free code. By using constructor overloading and chaining effectively, you’ll enhance both code readability and maintainability.


Key Takeaways

  • Constructors initialize Java objects with valid states.
  • Types include: default, parameterized, and copy constructors.
  • Java auto-generates a default constructor only if none is provided.
  • Use this() and super() to chain constructors.
  • Records and sealed classes impact constructor design in modern Java.

FAQ – Java Constructors

1. What is the return type of a constructor?
None. Constructors do not have a return type.

2. Can a constructor be private?
Yes, often used in Singleton or Factory patterns.

3. Can a constructor be overloaded?
Yes, using different parameter lists.

4. What is constructor chaining?
Calling one constructor from another using this() or super().

5. Can abstract classes have constructors?
Yes, and they are called when subclass instances are created.

6. What happens if a class has no constructor?
Java automatically provides a default constructor.

7. What is the use of a copy constructor?
To create a new object with the same data as another object.

8. Are constructors inherited?
No, constructors are never inherited in Java.

9. Can constructors be final, static, or abstract?
No. These keywords are not allowed with constructors.

10. Are records using constructors?
Yes. Records automatically generate canonical constructors.