abstract class GeometricObject { public String color; protected GeometricObject() { color = new String("blue"); } public GeometricObject(String color) { this.color = color; } public abstract double area(); } // Sphere, Rectangle, Cube, and Triangle class Sphere extends Circle { public Sphere() { super(); } public Sphere(String color, double radius) { super(color, radius); } public double area() { return 4 * Math.PI * radius * radius; } public double volume() { return 4 /3 * Math.PI * radius * radius * radius; } public double circumference() { System.out.println("It doesn't make sense to find the circumference of a sphere!"); return -1; } } class Rectangle extends GeometricObject { public double side1; public double side2; public Rectangle() { super(); side1 = 1; side2 = 1; } public Rectangle(String color, double side1, double side2) { super(color); this.side1 = side1; this.side2 = side2; } public double area() { return side1 * side2; } public double circumference() { return 2 * (side1 + side2); } } class Cube extends Rectangle { public Cube() { super(); } public Cube(String color, double side) { super(color, side, side); } public double area() { return 6 * super.area(); } public double volume() { return side1 * super.area(); } public double circumference() { System.out.println("It doesn't make sense to find the circumference of a cube!"); return -1; } } class Triangle extends GeometricObject { public double side1; public double side2; public double side3; public Triangle() { super(); side1 = 1; side2 = 1; side3 = 1; } public Triangle(String color, double side1, double side2, double side3) { super(color); this.side1 = side1; this.side2 = side2; this.side3 = side3; } // Heron's formula public double area() { double s = (side1 + side2 + side3) / 2; return Math.sqrt(s*(s-side1)*(s-side2)*(s-side3)); } public double circumference() { return side1 + side2 + side3; } } class Circle extends GeometricObject { public double radius; public Circle() { super(); radius = 2; } public Circle(String color, double radius) { super(color); this.radius = radius; } public double area() { return Math.PI * radius * radius; } public double circumference() { return 2 * Math.PI * radius; } } class Cylinder extends Circle { public double height; public Cylinder() { super(); height = 5; } public Cylinder(String color, double radius, double height) { super(color, radius); this.height = height; } public double area() { return 2 * super.area() + circumference() * height; } public double circumference() { System.out.println("It doesn't make sense to find the circumference of a cylinder!"); return -1; } public double volume() { return super.area() * height; } } class Driver { public static void main(String args[]) { System.out.println("Please enter 1 to create a Sphere, 2 for Rectangle, 3 for Cube, 4 for Triangle, 5 for Circle, 6 for Cylinder: "); int choice = UserInput.readInt(); switch(choice) { case 1: { System.out.println("Enter sphere radius: "); double r = UserInput.readDouble(); System.out.println("Enter sphere color: "); String c = UserInput.readString(); method(new Sphere(c,r)); break; } case 2: { System.out.println("Enter rectangle side 1: "); double s1 = UserInput.readDouble(); System.out.println("Enter rectangle side 2: "); double s2 = UserInput.readDouble(); System.out.println("Enter rectangle color: "); String c = UserInput.readString(); method(new Rectangle(c,s1,s2)); break; } case 3: { System.out.println("Enter cube side: "); double s = UserInput.readDouble(); System.out.println("Enter cube color: "); String c = UserInput.readString(); method(new Cube(c,s)); break; } case 4: { System.out.println("Enter triangle side 1: "); double s1 = UserInput.readDouble(); System.out.println("Enter triangle side 2: "); double s2 = UserInput.readDouble(); System.out.println("Enter triangle side 3: "); double s3 = UserInput.readDouble(); System.out.println("Enter triangle color: "); String c = UserInput.readString(); method(new Triangle(c,s1,s2,s3)); break; } case 5: { System.out.println("Enter circle radius: "); double r = UserInput.readDouble(); System.out.println("Enter circle color: "); String c = UserInput.readString(); method(new Circle(c,4)); break; } case 6: { System.out.println("Enter cylinder radius: "); double r = UserInput.readDouble(); System.out.println("Enter cylinder height: "); double h = UserInput.readDouble(); System.out.println("Enter cylinder color: "); String c = UserInput.readString(); method(new Cylinder(c,r,h)); break; } } } // think about what would happen if we changed the places of if statements for Cylinder, Circle and Sphere! // and similarly for Cube and Rectangle public static void method(GeometricObject geo) { System.out.println("Area is: " + geo.area()); if (geo instanceof Cylinder) { Cylinder c = (Cylinder) geo; System.out.println("C Area is: " + c.area()); System.out.println("C area is: " + c.area()); } else if (geo instanceof Sphere) { Sphere s = (Sphere) geo; System.out.println("S Area is: " + s.area()); System.out.println("S volume is: " + s.volume()); } else if (geo instanceof Circle) { Circle c = (Circle) geo; System.out.println("C Area is: " + c.area()); System.out.println("C circumference is: " + c.circumference()); } else if (geo instanceof Cube) { Cube c = (Cube) geo; System.out.println("C Area is: " + c.area()); System.out.println("C volume is: " + c.volume()); } else if (geo instanceof Rectangle) { Rectangle r = (Rectangle) geo; System.out.println("R Area is: " + r.area()); System.out.println("R circumference is: " + r.circumference()); } else if (geo instanceof Triangle) { Triangle t = (Triangle) geo; System.out.println("T Area is: " + t.area()); System.out.println("T circumference is: " + t.circumference()); } } }