Table of contents
1.
Introduction
2.
What is Constructor in Java?
2.1.
Types of Constructor
3.
What is Copy Constructor in Java?
4.
What is the Use of Java Copy Constructor?
5.
Writing a Copy Constructor
5.1.
Example of Java Constructor
5.2.
Java Copy Constructor Example
5.3.
Java
6.
Difference Between Copy Constructor and clone() Method
7.
Advantages of Copy Constructor in Java
8.
Disadvantages of Copy Constructor in Java
9.
Frequently Asked Questions
9.1.
Example of copy constructor in Java.
9.2.
What is the difference between constructor and copy constructor?
9.3.
Where is the copy constructor used?
9.4.
What is the difference between a shallow copy and a deep copy in the context of a Copy Constructor?
9.5.
What happens if you omit a Copy Constructor in a class with mutable fields?
10.
Conclusion
Last Updated: Feb 4, 2025
Easy

Copy Constructor in Java

Author Aditya Anand
1 upvote
Career growth poll
Do you think IIT Guwahati certified course can help you in your career?

Introduction

In Java programming, understanding the constructors is crucial for building efficient and scalable applications. Among these, the concept of a copy constructor holds significant importance, allowing developers to create new objects by copying values from existing ones. This blog delves into the intricacies of the copy constructor in Java, its practical applications, and how it enhances code reusability and maintainability.

Copy Constructor in Java

What is Constructor in Java?

In Java, a constructor is a piece of code that is similar to a method. This method is called when a new instance of a class is created. When the constructor is called, memory for the object is allocated in the memory.

It's a specific type of method for configuring an object.

When an object is formed with the new() keyword, at least one constructor is called.

The default constructor is used if no constructor is available in the class. In this case, the Java compiler constructs a default constructor for you.

Types of Constructor

Java supports various constructors, namely:

  • Default Constructor - This is the default constructor that can or cannot be specified.
  • Parameterized Constructor - When we create a constructor by ourselves using parameters, it is called the parameterised constructor.
  • Copy constructor - It is used to create a clone of an object.

What is Copy Constructor in Java?

A copy constructor in Java is a special type of constructor that allows for the creation of a new object by copying the values of another object of the same class. It provides a convenient way to initialize an object by duplicating the state of an existing object, thereby creating a separate instance with the same data.

In essence, a copy constructor takes an object as an argument and initializes a new object with the same state as the provided object. This includes copying the values of all member variables, whether they are primitive types, object references, or arrays. Copy constructors are particularly useful for creating deep copies of objects, ensuring that any changes made to the copied object do not affect the original object.

What is the Use of Java Copy Constructor?

The copy constructor in Java serves various purposes in object-oriented programming. Firstly, it allows developers to create a new object with the same state as an existing object, facilitating the creation of deep copies. This is particularly useful when dealing with complex objects containing nested structures or references to other objects. Additionally, copy constructors enable safe object initialization by ensuring that the new object is independent of the original, preventing unintended side effects from modifications to either instance. Furthermore, copy constructors can be utilized in scenarios such as cloning objects, implementing certain design patterns like Prototype, or facilitating object serialization and deserialization. Overall, the use of copy constructors adds flexibility, reliability, and maintainability to Java codebases by providing a mechanism for creating copies of objects tailored to specific requirements and use cases.

Writing a Copy Constructor

Let’s learn more about copy constructors by looking at some examples.

Example of Java Constructor

We develop a parameterized constructor that accepts the values for all instance variables and initialises them with the given values to initialise the values of instance variables of a class.

int brand;
int no;
public Car(String brand, int no){
   this.brand = brand;
   this.no = no;
}

Initialization: 

Car c = new Car(brand, no);

Java Copy Constructor Example

Copy Constructor accept an object of the current class and set the values of instance variables to the values in the obtained object.

public Car(Car c){
   this.brand = c.brand;
   this.no = c.no;
}

Initialization: 

Car copyOfC = new Car(c);
You can also try this code with Online Java Compiler
Run Code

Code Implementation

Let’s see an example program to understand the concept of copy constructor. we have created a car class, which has brand, no class variable. It has parameterised constructor and copy constructor and a display function to display the values.

  • Java

Java

import java.util.Scanner;
// class definition
public class Car {
   // variables
   private String brand;
   private int no;
   // normal constructor
   public Car(String brand, int no){
       this.brand = brand;
       this.no = no;
   }
   // copy constructor
   public Car(Car c){
       this.brand = c.brand;
       this.no = c.no;
   }
   // display function
   public void display(){
       System.out.println("brand : "+this.brand);
       System.out.println("no : "+this.no);
   }
   public static void main(String[] args) {
       String brand = "Ford";
       int no = 20;
       Car c = new Car(brand, no);
       System.out.println("Displaying the original object");
       c.display();
       System.out.println("Displaying the copied object");
       Car copyOfC = new Car(c);
       copyOfC.display();
   }
}
You can also try this code with Online Java Compiler
Run Code

Output 

Difference Between Copy Constructor and clone() Method

FeatureCopy Constructorclone() Method
PurposeCreates a new object with the same state as the original object.Creates a new object as a clone of the original object.
InheritedNot inherited, must be explicitly implemented.Inherited from the Cloneable interface, but requires explicit implementation of clone() method.
AccessCan access all accessible members, including private and protected.Can only access public members, may require casting.
Return TypeReturns a new object of the same class.Returns an Object, requiring casting to the appropriate type.
ExceptionsCannot throw checked exceptions.May throw CloneNotSupportedException.
Deep CopyRequires manual implementation for deep copying.Supports shallow copying by default, requires manual implementation for deep copying.
PerformanceGenerally more efficient due to direct access to members.Potentially less efficient due to method invocation and casting.
CustomizationProvides flexibility for custom copy behavior.Allows customization through overriding clone() method.
Clonable InterfaceNot required.Requires implementation of Cloneable interface.
ConstructorDefined as a special type of constructor.Implemented as a method within the class.

Advantages of Copy Constructor in Java

  • Controlled Copying: Provides developers with control over how objects are copied, allowing for customization according to specific requirements.
  • Deep Copy Support: Enables the creation of deep copies, ensuring that nested objects or references are duplicated accurately.
  • Safe Object Initialization: Helps in initializing new objects safely by preventing unintended side effects from modifications to the original object.
  • Flexibility: Offers flexibility for implementing custom copy behavior, accommodating various scenarios and use cases.
  • Efficiency: Generally more efficient than other copying mechanisms due to direct access to object members.

Disadvantages of Copy Constructor in Java

  • Manual Implementation: Requires manual implementation within classes, increasing development effort and potential for errors.
  • Not Inherited: Copy constructors are not inherited and must be explicitly implemented in each class where copying is required.
  • Limited Accessibility: Can only access accessible members of the object, which may limit its usability in certain scenarios.
  • No Built-in Cloning Support: Does not have built-in support for object cloning like the clone() method, requiring developers to implement deep copying manually.
  • Not Serializable: Objects created using copy constructors are not automatically serializable, requiring additional effort for serialization and deserialization.

Frequently Asked Questions

Example of copy constructor in Java.

An example of a copy constructor in Java is a class Person with a copy constructor Person(Person other) that creates a new Person object by copying the attributes of another Person object.

What is the difference between constructor and copy constructor?

The main difference between a constructor and a copy constructor lies in their purpose: constructors are used to initialize new objects, while copy constructors specifically create new objects by copying the state of existing ones.

Where is the copy constructor used?

Copy constructors are used in scenarios where objects need to be duplicated while maintaining the integrity of their state, such as creating deep copies, implementing cloning mechanisms, or initializing objects based on existing instances.

What is the difference between a shallow copy and a deep copy in the context of a Copy Constructor?

A shallow copy duplicates object references, meaning changes in the original affect the copied object. A deep copy creates independent copies of mutable fields, ensuring modifications in one object don’t impact the other.

What happens if you omit a Copy Constructor in a class with mutable fields?

Without a copy constructor, Java’s default object cloning (via assignment or default copy methods) may cause unintended shared references for mutable fields. This can lead to unintentional modifications, as changes in one object reflect in another, potentially causing unpredictable behavior.

Conclusion

The Copy Constructor in Java plays a crucial role in creating object copies while ensuring data integrity, especially when dealing with mutable fields. Understanding the difference between shallow and deep copies helps prevent unintended side effects in object manipulation. By implementing a well-defined copy constructor, developers can enhance code maintainability, avoid shared reference issues, and ensure object independence where needed.

Recommended Article:

Live masterclass