In your case yes you can override clone():
public class A {
}
public class B extends A implements Cloneable {
@Override
public B clone() throws CloneNotSupportedException {
return (B) super.clone();
}
}
and still have an effective clone mechanism - you are therefore telling the truth when you state implements Cloneable.
However, all that is needed to break that promise is to give A a private variable.
public class A {
private int a;
}
and now your promise is broken - unless A implements clone, in which case you can use super.clone():
public class A {
private int a;
@Override
public A clone() throws CloneNotSupportedException {
A newA = (A) super.clone();
newA.a = a;
return newA;
}
}
public class B extends A implements Cloneable {
private int b;
@Override
public B clone() throws CloneNotSupportedException {
B newB = (B) super.clone();
newB.b = b;
return newB;
}
}
Essentially - as Joshua Bloch states - if you don't implement clone your sub-classes also cannot (generally).
newInstance()method? Seems cleaner than passing in an existing object as a parameter; just as the object for a copy of itself (without using the brokenclone()).shallowClone()anddeepClone()customized methods, as an avoidance to the javaclone()nonsense. They wanted it entirely under their own control. Makes sense to me.