/**
* This method may be called to create a new copy of the
* Object. The typical behavior is as follows:
*
o == o.clone() is falseo.getClass() == o.clone().getClass()
* is trueo.equals(o) is trueHowever, these are not strict requirements, and may * be violated if necessary. Of the three requirements, the * last is the most commonly violated, particularly if the * subclass does not override {@link #equals(Object)}. * *
If the Object you call clone() on does not implement * {@link Cloneable} (which is a placeholder interface), then * a CloneNotSupportedException is thrown. Notice that * Object does not implement Cloneable; this method exists * as a convenience for subclasses that do. * *
Object's implementation of clone allocates space for the * new Object using the correct class, without calling any * constructors, and then fills in all of the new field values * with the old field values. Thus, it is a shallow copy. * However, subclasses are permitted to make a deep copy. * *
All array types implement Cloneable, and override
* this method as follows (it should never fail):
*
* public Object clone()
* {
* try
* {
* super.clone();
* }
* catch (CloneNotSupportedException e)
* {
* throw new InternalError(e.getMessage());
* }
* }
*
*
* @return a copy of the Object
* @throws CloneNotSupportedException If this Object does not
* implement Cloneable
* @throws OutOfMemoryError Since cloning involves memory allocation,
* even though it may bypass constructors, you might run
* out of memory
* @see Cloneable
*/
//protected Object clone() throws CloneNotSupportedException
//{
// if (this instanceof Cloneable)
// return VMObject.clone((Cloneable) this);
// throw new CloneNotSupportedException("Object not cloneable");
//}
/*
Tehat a klonozando osztalynak kotelezo jelleggel implementalnia kell a
Cloneable interfeszt, kulonben hibat dob es nem kapunk klont.
Ha ez megvan, akkor a super.clone() visszaadja az adott objektum klonjat
Object-kent, ezt kasztolva megkapjuk a kivant tipusu klont :)
Ebben az esetben a CloneNotSupportedException lekezelese igaz kotelezo,
de sosem fog elofordulni :P
*/
class Cloning
{
public static void main(String[] args)
{
Object obj1 = new Object();
// itt azert hasal el forditaskor, mert a clone() metodus protected,
// es jelenleg nem erjuk el
//1.// Object obj2 = obj1.clone();
Cloning c1 = new Cloning();
// itt mar mukodik, hisz elerjuk
// de a default clone() metodus implementacioja miatt Object visszateresi erteke van
//2.// Cloning c2 = c1.clone();
// castolni kell, kivetelkezelni es voila :)
try
{
Cloning c3 = (Cloning)c1.clone();
}
catch (CloneNotSupportedException cnse)
{
// de ez meg mindig hibat dob, mivel nincs implementalva a Cloning interface :)
cnse.printStackTrace();
}
// HELYES
Cloning2 c21 = new Cloning2();
Cloning2 c22 = c21.clone();
}
}
class Cloning2 implements Cloneable
{
@Override
protected/* or public*/ Cloning2 clone()
{
try
{
Object clone1 = super.clone();
Cloning2 clone2 = (Cloning2)clone1;
return clone2;
}
catch (CloneNotSupportedException cnse)
{
System.out.println("Never happens!");
return null;
}
}
}