Java Reference
In-Depth Information
In our example, the program will print Superwoman lives at 235 Main .Thisisnot
the desired behavior. After all, we only changed the address of the c1 object. Why should
the address of c2 be affected? The Java creators knew about the dangers of shallow copy.
Therefore, they designed the language in a way that requires the programmer to jump
through several hoops before they can use the clone method.
1. Override the clone method as public.
2. Inherit from the interface Cloneable .
3. Catch an exception.
The interface Cloneable happens to be empty. Implementing it simply tells Java: “I know
cloning is tricky and that the default cloning only provides shallow copy. I am either satisfied
with shallow copy, or I have rewritten the clone method to implement deep copy.”
Deep copy happens when we copy the data of an object, but we also copy all inner
objects by making new instances of them. Deep copy is only possible when there are
no recursive references. For example, if an object can contain a reference to itself, then
the deep copy method may never terminate.
Java requires that all subclasses that override the clone method implement the
Cloneable interface. For example, if this interface is not implemented, then the
CloneNotSupportedException exception is raised. Therefore, we need to add exception-
handling code when dealing with the clone method. In the above code, throws Exception
means that the method can generate an exception and the exception is not handled.
Next, let us rewrite our code. This time we will use deep copy.
class FictionalCharacter implements Cloneable
{
private String name;
private Address address ;
{
public FictionalCharacter ()
}
public FictionalCharacter(String name, Address address)
{
this .name = name;
this . address = address ;
}
public String toString() {
return name + " lives at " + address ;
}
protected Object clone () throws CloneNotSupportedException {
FictionalCharacter result = (FictionalCharacter) super .clone();
result . address = (Address) address . clone () ;
return result ;
}
}
class Address implements Cloneable
{
private String streetName;
private int number ;
 
Search WWH ::




Custom Search