MET53-J. Ensure that the clone() method calls super.clone()
Cloning a subclass a nonfinal class that defines a clone() method that fails to call super.clone() will produce an object of the wrong class.
The Java API [ API 2013 ] for the clone() method says:
By convention, the returned object should be obtained by calling
super.clone. If a class and all of its superclasses (exceptObject) obey this convention, it will be the case thatx.clone().getClass() == x.getClass().
Noncompliant Code Example
In this noncompliant code example, the clone() method in the class Base fails to call super.clone() :
class Base implements Cloneable {
public Object clone() throws CloneNotSupportedException {
return new Base();
}
protected void doLogic() {
System.out.println("Superclass doLogic");
}
}
class Derived extends Base {
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
protected void doLogic() {
System.out.println("Subclass doLogic");
}
public static void main(String[] args) {
Derived dev = new Derived();
try {
Base devClone = (Base)dev.clone(); // Has type Base instead of Derived
devClone.doLogic(); // Prints "Superclass doLogic" instead of "Subclass doLogic"
} catch (CloneNotSupportedException e) { /* ... */ }
}
}
Consequently, the object devClone ends up being of type Base instead of Derived , and the doLogic() method is incorrectly applied.
Compliant Solution
This compliant solution correctly calls super.clone() in the Base class's clone() method:
class Base implements Cloneable {
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
protected void doLogic() {
System.out.println("Superclass doLogic");
}
}
class Derived extends Base {
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
protected void doLogic() {
System.out.println("Subclass doLogic");
}
public static void main(String[] args) {
Derived dev = new Derived();
try {
// Has type Derived, as expected
Base devClone = (Base)dev.clone();
devClone.doLogic(); // Prints "Subclass doLogic" as expected
} catch (CloneNotSupportedException e) { /* ... */ }
}
}
Applicability
Failing to call super.clone() may cause a cloned object to have the wrong type.
Automated Detection
| Tool | Version | Checker | Description |
|---|---|---|---|
| CodeSonar | 9.0p0 | JAVA.CLASS.CLONE.CCSM JAVA.CLASS.MCS | Clone call to super is missing Missing call to super |
| Parasoft Jtest | 2025.2 | CERT.MET53.SCLONE | Call 'super.clone()' in all 'clone()' methods |
| SonarQube | 9.9 | S1182 |
Bibliography
| [ API 2013 ] | Class Object |


