what is Shallow copy and Deep Copy
clone method performs shallow copying. A shallow copy just copies the values of
the references in the class. Lets see it by an example.
the references in the class. Lets see it by an example.
If we clone Student s1 as Student s2. Then fields other than reference variables
are copied as separate variables, but the reference variable 'marks'
is same for both student s1 and s2. I.e, a shallow copy just copies the
values of the references in the class. So changes to the marks object
by student s1 is reflected to s2 and vice versa.
are copied as separate variables, but the reference variable 'marks'
is same for both student s1 and s2. I.e, a shallow copy just copies the
values of the references in the class. So changes to the marks object
by student s1 is reflected to s2 and vice versa.
public class Marks {
int maths, physics, chemistry;
Marks(int m, int p, int c){
maths = m;
physics = p;
chemistry = c;
}
}
class Student implements Cloneable{
int id;
String name;
Marks marks;
Student(int id, String name, Marks marks){
this.id = id;
this.name = name;
this.marks = marks;
}
void printMarks(){
System.out.println("Maths: " + marks.maths);
System.out.println("Physics: " + marks.physics);
System.out.println("Chemistry: " + marks.chemistry);
}
@Override
public String toString(){
return id + "." + name;
}
@Override
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
public class ShallowCopy {
public static void main(String args[]) throws CloneNotSupportedException{
Marks m1 = new Marks(95, 96, 75);
Student s1 = new Student(1, "rajdeo", m1);
Student s2 = (Student) s1.clone();
System.out.println("For student s1");
System.out.println(s1);
s1.printMarks();
System.out.println("For student s2");
System.out.println(s2);
s2.printMarks();
System.out.println("change marks of student s2");
s2.marks.maths = 35;
s2.marks.physics = 45;
s2.marks.chemistry = 55;
System.out.println("Change the name and id of student s2");
s2.name = "rajdeo";
s2.id = 2;
System.out.println("For student s1");
System.out.println(s1);
s1.printMarks();
System.out.println("For student s2");
System.out.println(s2);
s2.printMarks();
}
}
Output
For student s1
1.rajdeo
Maths: 95
Physics: 96
Chemistry: 75
For student s2
1.rajdeo
Maths: 95
Physics: 96
Chemistry: 75
change marks of student s2
Change the name and id of student s2
For student s1
1.rajdeo
Maths: 35
Physics: 45
Chemistry: 55
For student s2
2.singh
Maths: 35
Physics: 45
Chemistry: 55
Observe the output, the marks changed by Student s2 are reflected to s1, but not the name and id(Since these are not references).
Deep Copy
A shallow copy is a copy of the reference pointer to the object, whereas a deep copy is a copy of the object itself. We can achieve deep copy using Serialization.
import java.io.Serializable;
public class Marks implements Serializable{
int maths, physics, chemistry;
Marks(int m, int p, int c){
maths = m;
physics = p;
chemistry = c;
}
}
import java.io.Serializable;
class Student implements Serializable{
int id;
String name;
Marks marks;
Student(int id, String name, Marks marks){
this.id = id;
this.name = name;
this.marks = marks;
}
void printMarks(){
System.out.println("Maths: " + marks.maths);
System.out.println("Physics: " + marks.physics);
System.out.println("Chemistry: " + marks.chemistry);
}
@Override
public String toString(){
return id + "." + name;
}
}
import java.io.*;
public class DeepCopy {
public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException{
Marks m1 = new Marks(95, 96, 75);
Student s1 = new Student(1, "rajdeo", m1);
try (FileOutputStream fileOut = new FileOutputStream("student.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);) {
out.writeObject(s1);
out.close();
}
Student s2;
try (FileInputStream fileIn = new FileInputStream("student.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);) {
s2 = (Student) in.readObject();
in.close();
}
System.out.println("For student s1");
System.out.println(s1);
s1.printMarks();
System.out.println("For student s2");
System.out.println(s2);
s2.printMarks();
System.out.println("change marks of student s2");
s2.marks.maths = 35;
s2.marks.physics = 45;
s2.marks.chemistry = 55;
System.out.println("Change the name and id of student s2");
s2.name = "singh";
s2.id = 2;
System.out.println("For student s1");
System.out.println(s1);
s1.printMarks();
System.out.println("For student s2");
System.out.println(s2);
s2.printMarks();
}
}
Output
For student s1
1.rajdeo
Maths: 95
Physics: 96
Chemistry: 75
For student s2
1.rajdeo
Maths: 95
Physics: 96
Chemistry: 75
change marks of student s2
Change the name and id of student s2
For student s1
1.rajdeo
Maths: 95
Physics: 96
Chemistry: 75
For student s2
2.singh
Maths: 35
Physics: 45
Chemistry: 55
No comments:
Post a Comment