1 / 41
COP 3503 FALL 2012
SHAYAN JAVED
LECTURE 5
Programming Fundamentals using Java
2 / 41
Abstract Classes
3 / 41
Abstract classes
From the previous lecture:
public class GeometricObject {
protected String Color;
protected String name;
protected float area;
// Constructors…
// get/set methods…
}
4 / 41
Abstract classes
So we can do:
GeometricObject gObj = new GeometricObject(“AnObject, Red”);
5 / 41
Abstract classes
So we can do:
GeometricObject gObj = new GeometricObject(“AnObject, Red”);
But does it make sense to do this?
What is a “GeometricObject” by itself?
6 / 41
Abstract classes
Solution:
Make it abstract!
7 / 41
Abstract classes
Solution:
Make it abstract!
public abstract class GeometricObject {
8 / 41
Abstract classes
Used for defining classes for “abstract” concepts.
(‘GeometricObject’, ‘Animal’, etc.)
9 / 41
Abstract classes
Used for defining classes for “abstract” concepts.
(‘GeometricObject’, ‘Animal’, etc.)
Then define “concrete” concepts as subclasses.
(Circle, Rectangle, etc.)
10 / 41
Abstract classes
Used for defining classes for “abstract” concepts.
(‘GeometricObject’, ‘Animal’, etc.)
Then define “concrete” concepts as subclasses.
(Circle, Rectangle, etc.)
More strictness = less room for ambiguity/error.
11 / 41
Abstract classes
Every GeometricObject has an area.
12 / 41
Abstract classes
Every GeometricObject has an area.
But getArea() defined differently for concrete
objects.
13 / 41
Abstract classes
Every GeometricObject has an area.
But getArea() defined differently for concrete
objects.
(Not defined for the GeometricObject class)
14 / 41
Abstract classes
// Circle
public class Circle extends GeometricObject {
public float getArea() {
return [Link] * radius * radius;
}
}
15 / 41
Abstract classes
// Circle
public class Circle extends GeometricObject {
public float getArea() {
return [Link] * radius * radius;
}
}
// Rectangle
public class Rectangle extends GeometricObject {
public float getArea() {
return width * height;
}
}
16 / 41
Abstract classes
GeometricObject[] objs = new GeometricObject[2];
objs[0] = new Circle(3);
objs[1] = new Rectangle(1, 2);
for (GeometricObject i : objs) {
[Link]([Link]());
}
17 / 41
Abstract classes
GeometricObject[] objs = new GeometricObject[2];
objs[0] = new Circle(3);
objs[1] = new Rectangle(1, 2);
for (GeometricObject i : objs) {
[Link]([Link]());
}
Will not Compile! Cannot find “getArea()” in the
GeometricObject class.
18 / 41
Abstract classes
So make getArea() an abstract method in
GeometricObject.
19 / 41
Abstract classes
So make getArea() an abstract method in
GeometricObject.
Only a declaration in GeometricObject:
public abstract class GeometricObject {
...
public abstract float getArea();
}
20 / 41
Abstract classes
GeometricObject[] objs = new GeometricObject[2];
objs[0] = new Circle(3);
objs[1] = new Rectangle(1, 2);
for (GeometricObject i : objs) {
[Link]([Link]());
}
Will now work! getArea() defined in GeometricObject
21 / 41
Abstract class characteristics
Class has abstract methods = has to be an abstract
class
22 / 41
Abstract class characteristics
Class has abstract methods = has to be an abstract
class
But: Abstract class can have no abstract methods.
23 / 41
Abstract class characteristics
Class has abstract methods = has to be an abstract
class
But: Abstract class can have no abstract methods.
Subclass can be abstract, superclass can be
concrete.
24 / 41
Abstract class characteristics
Concrete subclasses must define superclass
abstract methods.
Circle, Rectangle have to define their own getArea();
Abstract methods can be defined, but usually
aren’t.
Abstract classes cannot be instantiated.
25 / 41
Abstract class characteristics
Abstract class can be used as a data type though.
Example:
GeometricObject gObj;
GeometricObject[] objs = new GeometricObject[2];
26 / 41
Abstract class characteristics
Why is this allowed:
GeometricObject[] objs = new GeometricObject[2];
They can’t be instantiated, so why allow as data
types?
27 / 41
Abstract class characteristics
GeometricObject[] objs = new GeometricObject[2];
objs[0] = new Circle(3);
objs[1] = new Rectangle(1, 2);
for (GeometricObject i : objs) {
[Link]([Link]());
}
Can take advantage of polymorphism!
28 / 41
Abstract classes
Let’s say we need to check if areas of
GeometricObjects are equal
29 / 41
Abstract classes
Let’s say we need to check if areas of
GeometricObjects are equal
Define method called equalArea(...)
30 / 41
Abstract classes
public static void main(String[] args) {
Circle c1 = new Circle(3.0);
Rectangle r1 = new Rectangle(2, 3);
Rectangle r2 = new Rectangle(1, 6);
SOP(“c1 and r1 have equal area: “ + equalArea(c, r1));
SOP(“r2 and r1 have equal area: “ + equalArea(r2,
r1));
}
31 / 41
Abstract classes
How do you define equalArea(...)?
32 / 41
Abstract classes
How do you define equalArea(...)?
public static boolean equalArea( ? obj1, ? obj2) {
return [Link]() == [Link]();
}
33 / 41
Abstract classes
Could define it for all different comparisons:
public static boolean equalArea( Circle c1, Rectangle
r1)
{
return [Link]() == [Link]();
}
34 / 41
Abstract classes
Could define it for all different comparisons:
public static boolean equalArea( Circle c1, Circle c2)
{
return [Link]() == [Link]();
}
35 / 41
Abstract classes
Could define it for all different comparisons:
public static boolean equalArea( Rectangle r1,
Rectangle r2)
{
return [Link]() == [Link]();
}
36 / 41
Abstract classes
Could define it for all different comparisons:
public static boolean equalArea( Rectangle r1,
Rectangle r2)
{
return [Link]() == [Link]();
}
Tedious...
37 / 41
Abstract classes
Make it general thanks to abstract methods/classes:
public static boolean equalArea( GeometricObject g1,
GeometricObject g2)
{
return [Link]() == [Link]();
}
38 / 41
Abstract classes
Why not use the Object class?
public static boolean equalArea( Object g1, Object g2)
{
return [Link]() == [Link]();
}
What’s the problem?
39 / 41
Abstract classes
Why not use the Object class?
public static boolean equalArea( Object g1, Object g2)
{
return [Link]() == [Link]();
}
What’s the problem?
Object class has no getArea() method!
40 / 41
Abstract classes
Why not use the Object class?
public static boolean equalArea( Object g1, Object g2)
{
return [Link]() == [Link]();
}
What’s the problem?
Object class has no getArea() method!
How would you fix it?
41 / 41
Abstract classes
Why not use the Object class?
public static boolean equalArea( Object g1, Object g2)
{
GeometricObject go1 = (GeometricObject)g1;
GeometricObject go2 = (GeometricObject)g2;
return [Link]() == [Link]();
}
Cast the objects
42 / 41
Next Lecture...
Interfaces.