0% found this document useful (0 votes)
36 views42 pages

COP 3503 FALL 2012: Shayan Javed

This document discusses abstract classes in Java. It explains that abstract classes are used to define abstract concepts like GeometricObject that will have subclasses defining specific implementations. Abstract classes can contain abstract methods that subclasses must implement, like an abstract getArea() method in GeometricObject. This allows subclasses like Circle and Rectangle to define their own getArea logic while still allowing them to be used polymorphically as the parent GeometricObject type.

Uploaded by

saber
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
36 views42 pages

COP 3503 FALL 2012: Shayan Javed

This document discusses abstract classes in Java. It explains that abstract classes are used to define abstract concepts like GeometricObject that will have subclasses defining specific implementations. Abstract classes can contain abstract methods that subclasses must implement, like an abstract getArea() method in GeometricObject. This allows subclasses like Circle and Rectangle to define their own getArea logic while still allowing them to be used polymorphically as the parent GeometricObject type.

Uploaded by

saber
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 42

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 Math.PI * radius * radius;
}
}
15 / 41

Abstract classes
// Circle
public class Circle extends GeometricObject {
public float getArea() {
return Math.PI * 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) {


System.out.println(i.getArea());
}
17 / 41

Abstract classes
GeometricObject[] objs = new GeometricObject[2];
objs[0] = new Circle(3);
objs[1] = new Rectangle(1, 2);

for (GeometricObject i : objs) {


System.out.println(i.getArea());
}

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) {


System.out.println(i.getArea());
}

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) {


System.out.println(i.getArea());
}

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 obj1.getArea() == obj2.getArea();
}
33 / 41

Abstract classes
 Could define it for all different comparisons:

public static boolean equalArea( Circle c1, Rectangle


r1)
{
return c1.getArea() == r2.getArea();
}
34 / 41

Abstract classes
 Could define it for all different comparisons:

public static boolean equalArea( Circle c1, Circle c2)


{
return c1.getArea() == c2.getArea();
}
35 / 41

Abstract classes
 Could define it for all different comparisons:

public static boolean equalArea( Rectangle r1,


Rectangle r2)
{
return r1.getArea() == r2.getArea();
}
36 / 41

Abstract classes
 Could define it for all different comparisons:

public static boolean equalArea( Rectangle r1,


Rectangle r2)
{
return r1.getArea() == r2.getArea();
}

Tedious...
37 / 41

Abstract classes
 Make it general thanks to abstract methods/classes:

public static boolean equalArea( GeometricObject g1,


GeometricObject g2)
{
return g1.getArea() == g2.getArea();
}
38 / 41

Abstract classes
 Why not use the Object class?

public static boolean equalArea( Object g1, Object g2)


{
return g1.getArea() == g2.getArea();
}

What’s the problem?


39 / 41

Abstract classes
 Why not use the Object class?

public static boolean equalArea( Object g1, Object g2)


{
return g1.getArea() == g2.getArea();
}

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 g1.getArea() == g2.getArea();
}

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 go1.getArea() == go2.getArea();
}

Cast the objects


42 / 41

Next Lecture...
 Interfaces.

You might also like