In Java 5, we have feature called covariant return type. Prior to Java5, we could not change the return type of the overridden method. It means that if you override the method in the subclass you need to downcast it to the subclass type.

The covariant return type in java, allows narrowing down return type of the overridden method. This feature will help to avoid down casting on the client side. It allows programmer to program without the need of type checking and down casting. The covariant return type always works only for non-primitive return types.

The Clone method will return the object where we need to downcast the Object to the subclass type. After Java5, we can override the clone method to return the object of subclass type.

Consider the scenario, where we have two types of manufacturer Mobile Phone and Washing Machine. Based on the customer requirement if the user wants to purchase Mobile Phone the overridden method will return the Mobile Phone object. Here the method getProductType will return the Mobile Phone object instead of Product object (Mobile Phone implements the Product interface). I.e. returns the object of subclass instead of superclass. Similarly the clone method in the Mobile Phone class will return the object of Mobile Phone instead of object of the class Object. The same rule applies to the Washing Machine class too.

Product.Java

public interface Product {
	public void makeProduct(String productName, String ProductOwner, int IMEINo);
}

MobilePhone.Java

public class MobilePhone implements Product, Cloneable {

	String _productName;
	String _ownerName;
	int _IMEINo;
	MobilePhone _clonedProduct;

	@Override
	public void makeProduct(String productName, String ownerName, int IMEINo) {
		// TODO Auto-generated method stub
		_productName = productName;
		_ownerName = ownerName;
		_IMEINo = IMEINo;
	}

	protected MobilePhone clone() throws CloneNotSupportedException {
		_clonedProduct = (MobilePhone) super.clone();
		return _clonedProduct;
		// return super.clone();
	}
}

WasingMachine.java

public class WasingMachine implements Product {

	String _productName;
	String _ownerName;
	int _modelNo;

	@Override
	public void makeProduct(String productName, String ownerName, int modelNo) {
		// TODO Auto-generated method stub
		_productName = productName;
		_ownerName = ownerName;
		_modelNo = modelNo;
	}

}

Manufacture.java

public interface Manufacture {

	public Product getProductType();

}

Apple.java

public class Apple implements Manufacture {

	@Override
	public MobilePhone getProductType() {
		// TODO Auto-generated method stub
		return new MobilePhone();
	}

}

Samsung.java

public class Samsung implements Manufacture {

	@Override
	public WasingMachine getProductType() {
		// TODO Auto-generated method stub
		return new WasingMachine();
	}

}

ManufactureImpl.java

public class ManufactureImpl {

	/**
	 * @param args
	 * @throws CloneNotSupportedException
	 */
	public static void main(String[] args) throws CloneNotSupportedException {
		// TODO Auto-generated method stub

		Apple s1 = new Apple();
		MobilePhone b1 = s1.getProductType();
		b1.makeProduct("Iphone5S", "XXXX", 1234);
		MobilePhone b2 = b1.clone();
		b2._IMEINo = 6789;
		System.out.println("IMEI Number Of Phone1->" + b1._IMEINo);
		System.out.println("IMEI Number Of Phone2->" + b2._IMEINo);
		Samsung f1=new Samsung();
		WasingMachine c1=f1.getProductType();
		c1.makeProduct("samsungWashingMachine","XYZ", 2014);
		System.out.println("Owner Name Of WasingMachine->" + c1._ownerName);
	}

}
This article is about: Core Java, Java Basics,

Nilanchala

A blogger, a bit of tech freak and a software developer. He is a thought leader in the fusion of design and mobile technologies. He is the author of Xamarin Mobile Application Development for Android Book (goo.gl/qUZ0XV3), DZone MVB and founder of stacktips.com.

Join The Discussion

Please note: We reserve the right to delete comments that contains snarky remarks, offensive or off-topic. To know more read our comments policy.