Presentation is loading. Please wait.

Presentation is loading. Please wait.

CIS3023: Programming Fundamentals for CIS Majors II Summer 2010 Ganesh Viswanathan Abstract Classes Course Lecture Slides 7 June 2010 “None of the abstract.

Similar presentations


Presentation on theme: "CIS3023: Programming Fundamentals for CIS Majors II Summer 2010 Ganesh Viswanathan Abstract Classes Course Lecture Slides 7 June 2010 “None of the abstract."— Presentation transcript:

1 CIS3023: Programming Fundamentals for CIS Majors II Summer 2010 Ganesh Viswanathan Abstract Classes Course Lecture Slides 7 June 2010 “None of the abstract concepts comes closer to fulfilled utopia than that of eternal peace.” --Theodor W. Adorno

2 Example Drawing Application Create different shapes: circle, rectangle, …

3

4

5 So now we can instantiate a GeometricObject as follows: GeometricObject g = new GeometricObject(); But does it make sense ?

6 Solution – Abstract Classes! Do not allow instantiation of GeometricObject class How? 6 Declare it as abstract as follows: public abstract class GeometricObject { … }

7 Abstract Class Want to add methods to compute area and perimeter of any GeometricObject

8 8 Abstract Class Added methods to compute area and perimeter for any GeometricObject!

9 9 public abstract class GeometricObject { private String color = "white"; private boolean filled; protected GeometricObject() { filled = false; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public boolean isFilled() { return filled; } public void setFilled(boolean filled) { this.filled = filled; } public String toString() { return "color: " + color + " and filled: " + filled; }

10 10 public class Circle extends GeometricObject { private double radius; public Circle() { radius = 1.0; } public Circle(double radius) { this.radius = radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public double getArea() { return radius * radius * Math.PI; } public double getPerimeter() { return 2 * radius * Math.PI; }

11 11 public class Rectangle extends GeometricObject { private double width; private double height; public Rectangle() { width = 1.0; height = 1.0; } public Rectangle(double width, double height) { this.width = width; this.height = height; } public double getWidth() { return width; } public void setWidth(double w){ width = w; } public double getHeight() { return height; } public void setHeight(double h) { height = h; } public double getArea() { return width * height; } public double getPerimeter() { return 2 * (width + height); }

12 public class Main { public static void main(String[] args) { GeometricObject[] objects = new GeometricObject[5]; objects[0] = new Circle(5); objects[1] = new Rectangle(5, 3); for(int i = 0; i < objects.length; i++){ if(objects[i] != null) System.out.println("Area: " + objects[i].getArea() + "Perimeter: " + objects[i].getPerimeter()); } } Will give error!! cannot find symbol: getArea( ) and getPerimeter( )

13 13 public abstract class GeometricObject { private String color = "white"; private boolean filled; protected GeometricObject() { filled = false; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public boolean isFilled() { return filled; } public void setFilled(boolean filled) { this.filled = filled; } public String toString() { return "color: " + color + " and filled: " + filled; } public abstract double getArea(); public abstract double getPerimeter(); } Solution

14 public class Main { public static void main(String[] args) { GeometricObject[] objects = new GeometricObject[5]; objects[0] = new Circle(5); objects[1] = new Rectangle(5, 3); for(int i = 0; i < objects.length; i++){ if(objects[i] != null) System.out.println("Area: " + objects[i].getArea() + "Perimeter: " + objects[i].getPerimeter()); } } Will compile successfully now!

15 15 public abstract class GeometricObject { private String color = "white"; private boolean filled; protected GeometricObject() { filled = false; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public boolean isFilled() { return filled; } public void setFilled(boolean filled) { this.filled = filled; } public String toString() { return "color: " + color + " and filled: " + filled; } public double getArea() { return 0; } public double getPerimeter { return 0; } } Why not create concrete getArea( ) and getPerimeter( ) methods with no bodies??

16 Abstract Class Characteristics A class that contains abstract methods must be abstract. However, it is possible to declare an abstract class that contains no abstract methods. A subclass can be abstract even if its superclass is concrete. 16

17 Abstract Class, contd. All derived classes of an abstract class will have to implement its abstract method(s), or they too will be abstract An abstract class cannot be instantiated An abstract class can be used as a data type though. 17 GeometricObject g; GeometricObject[] geo = new GeometricObject[10];

18 Why is the following allowed? Why allow abstract classes to be used as data types if they can not be instantiated? 18 GeometricObject[] geo = new GeometricObject[10];

19 19 public class Main { public static void main(String[] args) { GeometricObject[] objects = new GeometricObject[5]; objects[0] = new Circle(5); objects[1] = new Rectangle(5, 3); for(int i = 0; i < objects.length; i++){ if(objects[i] != null) System.out.println("Area: " + objects[i].getArea() + "Perimeter: " + objects[i].getPerimeter()); } } Allows you to take advantage of polymorphism!

20 20 public class TestGeometricObject { public static void main(String[] args) { Circle c = new Circle(5); Rectangle r1 = new Rectangle(5, 3); Rectangle r2 = new Rectangle(3, 3); System.out.println(“c and r1 have equal area: " + equalArea(c, r1)); System.out.println(“r1 and r2 have equal area: " + equalArea(r1, r2)); } // what should the definition of equalArea() look like? public static boolean equalArea( ? obj1, ? obj2) { return obj1.getArea() == obj2.getArea(); }

21 21 public class TestGeometricObject { public static void main(String[] args) { Circle c = new Circle(5); Rectangle r1 = new Rectangle(5, 3); Rectangle r2 = new Rectangle(3, 3); System.out.println(“c and r1 have equal area: " + equalArea(c, r1)); System.out.println(“r1 and r2 have equal area: " + equalArea(r1, r2)); } // what should the definition of equalArea() look like? public static boolean equalArea( Circle o1, Rectangle o2){ return o1.getArea() == o2.getArea(); } public static boolean equalArea( Rectangle o1, Rectangle o2){ return o1.getArea() == o2.getArea(); } Option 1

22 22 public class TestGeometricObject { public static void main(String[] args) { Circle c = new Circle(5); Rectangle r1 = new Rectangle(5, 3); Rectangle r2 = new Rectangle(3, 3); System.out.println(“c and r1 have equal area: " + equalArea(c, r1)); System.out.println(“r1 and r2 have equal area: " + equalArea(r1, r2)); } public static boolean equalArea(GeometricObject obj1, GeometricObject obj2) { return obj1.getArea() == obj2.getArea(); }

23 23 public class TestGeometricObject { public static void main(String[] args) { GeometricObject geoObject1 = new Circle(5); GeometricObject geoObject2 = new Rectangle(5, 3); System.out.println(“geoObject1 and geoObject2 have area: " + equalArea(geoObject1, geoObject2)); System.out.println(“geoObject2 and geoObject3 have area: " + equalArea(geoObject2, geoObject3)); } public static boolean equalArea(Object obj1, Object obj2) { // why not declare the parameters as Object type? return obj1.getArea() == obj2.getArea(); } Will give an error as Object class has no getArea( ) method!

24 24 public class TestGeometricObject { public static void main(String[] args) { GeometricObject geoObject1 = new Circle(5); GeometricObject geoObject2 = new Rectangle(5, 3); System.out.println(“geoObject1 and geoObject2 have area: " + equalArea(geoObject1, geoObject2)); System.out.println(“geoObject2 and geoObject3 have area: " + equalArea(geoObject2, geoObject3)); } public static boolean equalArea(Object obj1, Object obj2) { // why not declare the parameters as Object type? GeometricObject g1 = (GeometricObject)obj1; GeometricObject g2 = (GeometricObject)obj2; return g1.getArea() == g2.getArea(); }

25 Get more info! http://java.sun.com/docs/books/tutorial/java/IandI/abstract.html http://mindprod.com/jgloss/interfacevsabstract.html


Download ppt "CIS3023: Programming Fundamentals for CIS Majors II Summer 2010 Ganesh Viswanathan Abstract Classes Course Lecture Slides 7 June 2010 “None of the abstract."

Similar presentations


Ads by Google