Discuss the below:
Q: Create a test program that creates an array of shapes consisting of several instances of Circ, Rect, and Octagon and displays their area and perimeter.
* Create a new Octagon object by using the clone() method and compare the two objects using the compareTo() method.
* Include in your test program the method that returns the largest object in an array of objects. The method header is
public static Object max(Object[] a)
All the objects are assumed to be the instances of the Comparable interface.
* Apply the method max to your array of shapes to find and display the maximum one.
The project should include the following classes: Circ, Rect, Shape, Octagon, and Test (the main class containing the main() method). Redesign the first two classes to implement the Comparable and Cloneable interfaces.
1 public class Rect extends Shape 
{
 private int width;
 private int height;
public Rect()
 {
 super();
 width = height = 0;
 }
public Rect(int xLoc, int yLoc, int width, int height)
 {
 super(xLoc, yLoc);
 this.width = width;
 this.height = height;
 }
public double getArea()
 {
 return width * height;
 }
public void stretchBy(double factor)
 {
 width =  (int)Math.round(width * factor);
 height = (int)Math.round(height * factor);
 }
public String toString()
 {
 String str = "RECTANGLE \n"
 + super.toString()
 + "Width & Height: " + width + " " + height + "\n"
 + "Area: " + getArea();
 return str;
 }
}
abstract public class Shape
{
  private int xPos;
  private int yPos;
  public Shape()
  {
     xPos = 0;
     yPos = 0;
  }
  public Shape(int xPos, int yLoc)
  {
     this.xPos = xPos;
     yPos = yLoc;
  }
  public final int getX()
  {
     return xPos;
  }
  public final int getY()
  {
     return yPos;
  }
  public void moveTo(int newX, int newY)
  {
     xPos += newX;
     yPos += newY;
  }
  abstract public double getArea();
  abstract public void stretchBy(double factor);
  
  public String toString()
  {
     return "(X,Y) Position: (" + xPos + "," + yPos + ") \n";
  }
}
abstract public class Shape
{
  private int xPos;
  private int yPos;
public Shape()
 {
 xPos = 0;
 yPos = 0;
 }
public Shape(int xPos, int yLoc)
 {
 this.xPos = xPos;
 yPos = yLoc;
 }
public final int getX()
 {
 return xPos;
 }
public final int getY()
 {
 return yPos;
 }
public void moveTo(int newX, int newY)
 {
 xPos += newX;
 yPos += newY;
 }
abstract public double getArea();
abstract public void stretchBy(double factor);
 
 public String toString()
 {
 return "(X,Y) Position: (" + xPos + "," + yPos + ") \n";
 }
}