cis3023: programming fundamentals for cis majors ii summer 2010

25
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

Upload: miach

Post on 16-Feb-2016

30 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

JAVA -Abstract Class

CIS3023: Programming Fundamentals for CIS Majors IISummer 2010

Ganesh Viswanathan

Abstract ClassesCourse Lecture Slides7 June 2010None of the abstract concepts comes closer to fulfilled utopia than that of eternal peace. --Theodor W. Adorno11The Principle of Intimate Engagement: You must commit to the problemRoll up your sleevesGet your hands dirty.ExampleDrawing ApplicationCreate different shapes: circle, rectangle,

So now we can instantiate a GeometricObject as follows:

GeometricObject g = new GeometricObject();

But does it make sense ?

Solution Abstract Classes!Do not allow instantiation of GeometricObject class

How?

6Declare it as abstract as follows:

public abstract class GeometricObject {}

Abstract ClassWant to add methods to compute area and perimeter of any GeometricObject

8Abstract ClassAdded methods to compute area and perimeter for any GeometricObject!9public 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; } } 10public 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; }

}11public 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);}}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( )13public 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(); } Solutionpublic 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!15public 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??Abstract Class CharacteristicsA 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. 16Abstract 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.

17GeometricObject g;GeometricObject[] geo = new GeometricObject[10];Why is the following allowed?

Why allow abstract classes to be used as data types if they can not be instantiated?

18GeometricObject[] geo = new GeometricObject[10];19public 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!20public 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();}} 21public 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 122public 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(); }} 23public 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!24public 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(); }} Get more info! http://java.sun.com/docs/books/tutorial/java/IandI/abstract.htmlhttp://mindprod.com/jgloss/interfacevsabstract.html

Rectangle

-color: String

-filled: Boolean

-dateCreated: java.util.Date

-width: double

-height: double

+Rectangle()

+Rectangle(width: double, height: double)

+getWidth(): double

+setWidth(width: double): void

+getHeight(): double

+getColor(): String

+setColor(color: String): void

+isFilled(): boolean

+setFilled(filled: boolean): void

+getDateCreated(): java.util.Date

+setHeight(height: double): void

+getArea(): double

+getPerimeter(): double

Circle

-color: String

-filled: Boolean

-dateCreated: java.util.Date

-radius: double

+Circle()

+Circle(radius: double)

+getRadius(): double

+setRadius(radius: double): void

+getColor(): String

+setColor(color: String): void

+isFilled(): boolean

+setFilled(filled: boolean): void

+getDateCreated(): java.util.Date

+getArea(): double

+getPerimeter(): double

+getDiameter(): double

The color of the object (default: white).

Indicates whether the object is filled with a color (default: false).

The date when the object was created.

Creates a GeometricObject.

Returns the color.

Sets a new color.

Returns the filled property.

Sets a new filled property.

Returns the dateCreated.

Returns a string representation of this object.

Rectangle

-width: double

-height: double

+Rectangle()

+Rectangle(width: double, height: double)

+getWidth(): double

+setWidth(width: double): void

+getHeight(): double

+setHeight(height: double): void

+getArea(): double

+getPerimeter(): double

GeometricObject

-color: String

-filled: boolean

-dateCreated: java.util.Date

+GeometricObject()

+getColor(): String

+setColor(color: String): void

+isFilled(): boolean

+setFilled(filled: boolean): void

+getDateCreated(): java.util.Date

+toString(): String

Circle

-radius: double

+Circle()

+Circle(radius: double)

+getRadius(): double

+setRadius(radius: double): void

+getArea(): double

+getPerimeter(): double

+getDiameter(): double

The color of the object (default: white).

Indicates whether the object is filled with a color (default: false).

The date when the object was created.

Creates a GeometricObject.

Returns the color.

Sets a new color.

Returns the filled property.

Sets a new filled property.

Returns the dateCreated.

Returns a string representation of this object.

Rectangle

-width: double

-height: double

+Rectangle()

+Rectangle(width: double, height: double)

+getWidth(): double

+setWidth(width: double): void

+getHeight(): double

+setHeight(height: double): void

+getArea(): double

+getPerimeter(): double

GeometricObject

-color: String

-filled: boolean

-dateCreated: java.util.Date

+GeometricObject()

+getColor(): String

+setColor(color: String): void

+isFilled(): boolean

+setFilled(filled: boolean): void

+getDateCreated(): java.util.Date

+toString(): String

Circle

-radius: double

+Circle()

+Circle(radius: double)

+getRadius(): double

+setRadius(radius: double): void

+getArea(): double

+getPerimeter(): double

+getDiameter(): double

The color of the object (default: white).

Indicates whether the object is filled with a color (default: false).

The date when the object was created.

Creates a GeometricObject.

Returns the color.

Sets a new color.

Returns the filled property.

Sets a new filled property.

Returns the dateCreated.

Returns a string representation of this object.

Rectangle

-width: double

-height: double

+Rectangle()

+Rectangle(width: double, height: double)

+getWidth(): double

+setWidth(width: double): void

+getHeight(): double

+setHeight(height: double): void

+getArea(): double

+getPerimeter(): double

GeometricObject

-color: String

-filled: boolean

-dateCreated: java.util.Date

+GeometricObject()

+getColor(): String

+setColor(color: String): void

+isFilled(): boolean

+setFilled(filled: boolean): void

+getDateCreated(): java.util.Date

+toString(): String

Circle

-radius: double

+Circle()

+Circle(radius: double)

+getRadius(): double

+setRadius(radius: double): void

+getArea(): double

+getPerimeter(): double

+getDiameter(): double