Copy Constructor in Java - BunksAllowed

BunksAllowed is an effort to facilitate Self Learning process through the provision of quality tutorials.

Community

This is a technique that creates a copy of an existing object of the same class. Though, Java does not have a built-in copy constructor like some other languages (e.g., C++), you can define one in your class. Here are some reasons why you might need a copy constructor in Java:
  • Clone an Object: When you need to create a new instance that is a copy of an existing instance with the same values. 
  • Deep Copy vs. Shallow Copy: To make a deep copy of an object, where you also create copies of the objects referred to by the original object. This is particularly useful if your object contains fields that are references to other objects. 
  • Immutable Objects: When working with immutable objects, a copy constructor can help in creating new instances with modified values. 
  • Customization: To provide more control over the copying process, such as modifying some fields while copying others. 
  • Alternative to Cloning: To avoid using the `clone` method, which requires implementing the `Cloneable` interface and handling `CloneNotSupportedException`.

In this example, first, an object c is created. Later, we want to create another object cnew which is nothing but a copy of the object c. Here, the second constructor receives the object c as a parameter and creates a new object cnew. Copy constructor is an important feature,

ComplexNum.java
public class ComplexNum { float x; float y; public ComplexNum(int x, int y) { this.x = x; this.y = y; } // copy constructor public ComplexNum(ComplexNum ob) { this.x = ob.x; this.y = ob.y; } }

TestMain.java
public class TestMain { public static void main(String[] args) { ComplexNum c = new ComplexNum(10, 5); // copy constructor call ComplexNum cnew = new ComplexNum(c); } }

Here's another example of how to implement a copy constructor in Java:

Person.java
public class Person { private String name; private int age; private Address address; // Regular constructor public Person(String name, int age, Address address) { this.name = name; this.age = age; this.address = address; } // Copy constructor public Person(Person other) { this.name = other.name; this.age = other.age; // For deep copy this.address = new Address(other.address); } // Getters and Setters public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }

Address.java
class Address { private String city; private String state; // Regular constructor public Address(String city, String state) { this.city = city; this.state = state; } // Copy constructor public Address(Address other) { this.city = other.city; this.state = other.state; } // Getters and Setters public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } }



Main.java
public class Main { public static void main(String[] args) { Address address = new Address("New York", "NY"); Person person1 = new Person("John Doe", 30, address); // Creating a copy of person1 Person person2 = new Person(person1); System.out.println(person1.getName()); // John Doe System.out.println(person2.getName()); // John Doe // Modifying the address in person2 should not affect person1 (deep copy) person2.getAddress().setCity("Los Angeles"); System.out.println(person1.getAddress().getCity()); // New York System.out.println(person2.getAddress().getCity()); // Los Angeles } }

In this example: 
  • The `Person` class has a copy constructor that creates a new `Person` object by copying the fields from another `Person` object.
  • The `Address` class also has a copy constructor to ensure deep copying.

This demonstrates how the copy constructor allows you to create a new instance with the same state as an existing instance, ensuring that changes to the copied object do not affect the original object.

Happy Exploring!

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.