Exercise1 Create an abstract class called GeometricShape. A Geometric Shape has a color and may or may not be filled with that color. GeometricShape should contain a default constructor that creates a shape filled with the color white, as well as getters and setters for the two instance data and a toString method. Create two abstract methods: one for getting the area of a shape, and one for getting the perimeter of a shape. Exercise2 Modify Geometric shape so that it implements the comparable interface Then create a static method called max that accepts two GeometricShapes as parameters and returns the larger of the two objects. If the objects are the same size, return the first object passed as a parameter Exercise 3 Create two child classes of GeometricShape, one called Circle and one called Octagon. Octagon has a side length, Circle has a radius, and each should have an appropriate constructor for initializing instance data. In each class provide getters and setters for the side length/radius and a toString method. In both of these classes, be sure to implement the abstract methods of the parent class, as well as the compareTo method. How should shapes be compared? How do you tell if one shape is larger than another? Probably by area. Exercise4 Create a static method for finding the total sum of the areas of a collection of GeometricShapes-The method signature is: public static double sumArea (GeometricShape] shapes) Exercise5 Create a tester class called FunWithShapes. Create an Array of GeometricShapes that contains several Octagons and several Circles. Show that each of the following methods work correctly, for objects of either type: maX sumArea . compare To (for both Circle and Octagon) .Use Arrays.sort to demonstrate that your collection of shapes is sorted ascendingly by area Exercise 6 Create a comparator called ShapeComparator that compares GeometricShape objects by perimeter. In FunWithShapes, use the comparator to sort the collection in descending order