Download presentation
Presentation is loading. Please wait.
Published byFrancis Reynolds Modified over 8 years ago
1
1 / 41 COP 3503 FALL 2012 SHAYAN JAVED LECTURE 5 Programming Fundamentals using Java 1
2
2 / 41 Abstract Classes
3
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
4 / 41 Abstract classes So we can do: GeometricObject gObj = new GeometricObject(“AnObject, Red”);
5
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
6 / 41 Abstract classes Solution: Make it abstract!
7
7 / 41 Abstract classes Solution: Make it abstract! public abstract class GeometricObject {
8
8 / 41 Abstract classes Used for defining classes for “abstract” concepts. (‘GeometricObject’, ‘Animal’, etc.)
9
9 / 41 Abstract classes Used for defining classes for “abstract” concepts. (‘GeometricObject’, ‘Animal’, etc.) Then define “concrete” concepts as subclasses. (Circle, Rectangle, etc.)
10
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
11 / 41 Abstract classes Every GeometricObject has an area.
12
12 / 41 Abstract classes Every GeometricObject has an area. But getArea() defined differently for concrete objects.
13
13 / 41 Abstract classes Every GeometricObject has an area. But getArea() defined differently for concrete objects. (Not defined for the GeometricObject class)
14
14 / 41 Abstract classes // Circle public class Circle extends GeometricObject { public float getArea() { return Math.PI * radius * radius; }
15
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
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
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
18 / 41 Abstract classes So make getArea() an abstract method in GeometricObject.
19
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
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
21 / 41 Abstract class characteristics Class has abstract methods = has to be an abstract class
22
22 / 41 Abstract class characteristics Class has abstract methods = has to be an abstract class But: Abstract class can have no abstract methods.
23
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
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
25 / 41 Abstract class characteristics Abstract class can be used as a data type though. Example: GeometricObject gObj; GeometricObject[] objs = new GeometricObject[2];
26
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
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
28 / 41 Abstract classes Let’s say we need to check if areas of GeometricObjects are equal
29
29 / 41 Abstract classes Let’s say we need to check if areas of GeometricObjects are equal Define method called equalArea(...)
30
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
31 / 41 Abstract classes How do you define equalArea(...)?
32
32 / 41 Abstract classes How do you define equalArea(...)? public static boolean equalArea( ? obj1, ? obj2) { return obj1.getArea() == obj2.getArea(); }
33
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
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
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
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
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
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
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
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 / 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
42 / 41 Next Lecture... Interfaces.
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.