0% found this document useful (0 votes)
24 views

L12. Polymorphism, Interfaces, Abstract Classes

This document discusses polymorphism and interfaces in Java. It provides code examples of an Employee class and subclasses like Marketer and Lawyer that extend the Employee class. The subclasses can override methods like getSalary() to provide subclass-specific behavior. The code also shows how polymorphism allows a reference variable of a superclass type to refer to an object of a subclass type, enabling subclass-specific behaviors. It demonstrates polymorphism with parameters, arrays, and interpreting inheritance and method calls. The document also discusses casting references to access subclass-specific methods and the limitations of casting. Finally, it mentions that interfaces define common behaviors without providing implementations.

Uploaded by

haladaher5555
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
24 views

L12. Polymorphism, Interfaces, Abstract Classes

This document discusses polymorphism and interfaces in Java. It provides code examples of an Employee class and subclasses like Marketer and Lawyer that extend the Employee class. The subclasses can override methods like getSalary() to provide subclass-specific behavior. The code also shows how polymorphism allows a reference variable of a superclass type to refer to an object of a subclass type, enabling subclass-specific behaviors. It demonstrates polymorphism with parameters, arrays, and interpreting inheritance and method calls. The document also discusses casting references to access subclass-specific methods and the limitations of casting. Finally, it mentions that interfaces define common behaviors without providing implementations.

Uploaded by

haladaher5555
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 36

Polymorphism

&
Interfaces
Reading Materials: 9.3 and 9.5
public class Employee {
Polymorphism
public int getHours() {
return 40; // works 40 hours / week
}
public double getSalary() {
return 50000.0; // $50,000.00 / year
}
public int getVacationDays() {
return 10; // 2 weeks' paid vacation
}
public String getVacationForm() {
return "yellow"; // use the yellow form
}
}

public class Marketer extends Employee {


public void advertise() {
System.out.println("Act now while supplies last!");
}
public double getSalary() {
return super.getSalary() + 10000.0;
}
}
2
Polymorphism
public class Lawyer extends Employee {
public String getVacationForm() {
return "pink";
}
public void sue() {
System.out.println("I'll see you in court!");
}
public int getVacationDays() {
return super.getVacationDays() + 5;
}
}
public class Secretary extends Employee {
public void takeDictation(String text) {
System.out.println("Taking dictation of text: " + text);
}
}
public class LegalSecretary extends Secretary {
public double getSalary() {
return super.getSalary() + 5000.0;
}
public void fileLegalBriefs() {
System.out.println("I could file all day!");
} 3
}
Polymorphism
• Polymorphism: Ability for the same code to be used with different
types of objects and behave differently with each.
• The type of a reference variable that refers to an object does not have
to exactly match the type of the object.
– It is legal for a superclass variable to refer to an object of its subclass
Employee ed = new Lawyer();
• You can call any methods from the Employee class on ed.
• ed is really a Lawyer object not an Employee object
– If we call method on ed, it will behave like a Lawyer object
System.out.println(ed.getVacationForm());
// returns pink which is a Lawyer’s behavior of

4
Polymorphism and parameters
• We can write a method that accepts an Employee as a parameter, then we can
pass any subtype (such as Lawyer, Secretary, etc) of a parameter's type.
public class EmployeeMain {
public static void main(String[] args) {
Lawyer lisa = new Lawyer();
Secretary steve = new Secretary();
printInfo(lisa);
printInfo(steve);
}
public static void printInfo(Employee empl) {
System.out.println("salary: " + empl.getSalary());
System.out.println("v.days: " + empl.getVacationDays());
System.out.println("v.form: " + empl.getVacationForm());
System.out.println();
}
}

OUTPUT:
salary: 50000.0 salary: 50000.0
v.days: 15 v.days: 10
v.form: pink v.form: yellow
5
Polymorphism and arrays
• Arrays of superclass types can store any subtype as elements.
public class EmployeeMain2 {
public static void main(String[] args) {
Employee[] e = { new Lawyer(), new Secretary(),
new Marketer(), new LegalSecretary() };
for (int i = 0; i < e.length; i++) {
System.out.println("salary: " + e[i].getSalary());
System.out.println("v.days: " + e[i].getVacationDays());
System.out.println();
}
}
}
Output:
salary: 50000.0
v.days: 15
salary: 50000.0
v.days: 10
salary: 60000.0
v.days: 10
salary: 55000.0
v.days: 10
6
Polymorphism:
Interpreting Inheritance Code
• Suppose that the following four classes have been declared:
public class Foo {
public void method1() {
System.out.println("foo 1"); Diagramming the classes
} • Add classes from top superclass to bottom
public void method2() {
System.out.println("foo 2"); subclass.
} • Include all inherited methods.
public String toString() {
return "foo";
}
}
public class Bar extends Foo {
public void method2() {
System.out.println("bar 2");
}
}
public class Baz extends Foo {
public void method1() {
System.out.println("baz 1");
}
public String toString() {
return "baz";
}
}
public class Mumble extends Baz {
public void method2() {
System.out.println("mumble 2");
}
} 7
Polymorphism:
Interpreting Inheritance Code
• What would be the output of the following client code?
Foo[] pity = {new Baz(), new Bar(), new Mumble(), new Foo()};
for (int i = 0; i < pity.length; i++) {
System.out.println(pity[i]);
pity[i].method1();
pity[i].method2();
System.out.println();
}
• Output:
baz
baz 1
foo 2
foo
foo 1 method Foo Bar Baz Mumble
bar 2
baz toString foo foo baz baz
baz 1
mumble 2 method1 foo 1 foo 1 baz 1 baz 1
foo method2 foo 2 bar 2 foo 2 mumble 2
foo 1
foo 2 8
Polymorphism:
Interpreting Complex Calls
• The methods sometimes call other methods Issue with inheritance
public class Ham { • Lamb inherits Ham's a. a calls
public void a() { b. But Lamb overrides b.
System.out.print("Ham a ");
b(); • Which b will be called? Lamb
} or Ham
public void b() {
System.out.print("Ham b ");
}
public String toString() {
return "Ham";
}
}
public class Lamb extends Ham {
public void b() {
System.out.print("Lamb b ");
}
}
public class Yam extends Lamb {
public void a() { method Ham Lamb Yam Spam
System.out.print("Yam a ");
super.a(); a Ham a Ham a Yam a Yam a
}
public String toString() { b() b() Ham a Ham a
return "Yam"; b() b()
}
}
public class Spam extends Yam { b Ham b Lamb b Lamb b Spam b
public void b() {
System.out.print("Spam b "); toString Ham Ham Yam Yam
}
}
9
Polymorphism:
Interpreting Complex Calls
• What would be the output of the following client code?
Ham[] food = {new Lamb(), new Ham(), new Spam(), new Yam()};
for (int i = 0; i < food.length; i++) {
System.out.println(food[i]);
food[i].a();
System.out.println(); //to end the line of output
food[i].b();
System.out.println(); //to end the line of output
System.out.println();
}
• Output:
Ham
Ham a Lamb b
Lamb b
Ham method Ham Lamb Yam Spam
Ham a Ham b a Ham a Ham a Yam a Yam a
Ham b b() b() Ham a Ham a
Yam b() b()
Yam a Ham a Spam b
Spam b b Ham b Lamb b Lamb b Spam b
Yam toString Ham Ham Yam Yam
Yam a Ham a Lamb b
Lamb b
10
Casting references
• A variable can only call that type's methods, not a subtype's.
Employee ed = new Lawyer();
int hours = ed.getHours(); // ok; it's in Employee
ed.sue(); // compiler error

• The compiler's reasoning is, variable ed could store any kind of


employee, and not all kinds know how to sue .

• To use Lawyer methods on ed, we can type-cast it.


Lawyer theRealEd = (Lawyer) ed;
theRealEd.sue(); // ok
((Lawyer) ed).sue(); // shorter version

11
More about casting
• The code crashes if you cast an object too far down the tree.
Employee eric = new Secretary();
((Secretary) eric).takeDictation("hi"); // ok
((LegalSecretary) eric).fileLegalBriefs(); // exception
//(Secretary object doesn't know how to file briefs)

• You can cast only up and down the tree, not sideways.
Lawyer linda = new Lawyer();
((Secretary) linda).takeDictation("hi"); // error

• Casting doesn't actually change the object's behavior. It just gets the
code to compile/run.
((Employee) linda).getVacationForm() //pink (Lawyer's)
12
Interfaces
• Interface: An interface is like a class, but it contains only method
headers without bodies.
– A class can promise to implement an interface, meaning that the class promises
to provide implementations of all the methods that are declared in the interface.
– Classes that implements an interface forms is-a relationship with that interface.

• Example:
– Write a set of Circle, Rectangle, and Triangle classes.
– Certain operations that are common to all shapes.
perimeter - distance around the outside of the shape
area - amount of 2D space occupied by the shape
– Every shape has them but computes them differently.

13
Shape area, perimeter
• Rectangle (as defined by width w and height h):
area =wh
perimeter = 2w + 2h

• Circle (as defined by radius r):


area =  r2
perimeter =2r

• Triangle (as defined by side lengths a, b, and c)


area = √(s (s - a) (s - b) (s - c))
where s = ½ (a + b + c)
perimeter =a+b+c
14
Common behavior
• Write shape classes with methods perimeter and area.
• We'd like to be able to write client code that treats different kinds of
shape objects in the same way, such as:
– Write a method that prints any shape's area and perimeter.
– Create an array of shapes that could hold a mixture of the various shape
objects.
– Write a method that could return a rectangle, a circle, a triangle, or any
other shape we've written.
– Make a DrawingPanel display many shapes on screen.

15
Interfaces
• interface: A list of methods that a class can implement.
– Inheritance gives you an is-a relationship and code-sharing.
• A Lawyer object can be treated as an Employee, and
Lawyer inherits Employee's code.

– Interfaces give you an is-a relationship without code sharing.


• A Rectangle object can be treated as a Shape.

– Analogous to the idea of roles or certifications:


• "I'm certified as a CPA accountant. That means I know how to compute
taxes, perform audits, and do consulting."

• "I'm certified as a Shape. That means I know how to compute my area and
perimeter."
16
Declaring an interface
public interface name {
public type name(type name, ..., type name);
public type name(type name, ..., type name);
...
}
• Example:
public interface Vehicle {
public double speed();
public void setDirection(int direction);
}

• abstract method: A header without an implementation.


– The actual body is not specified, to allow/force different classes to implement
the behavior in its own way.
17
Shape interface
public interface Shape {
public double area();
public double perimeter();
}
– This interface describes the features common to all shapes.
(Every shape has an area and perimeter.)

• Arrow goes up from class to interface(s)


it implements.
– There is a supertype-subtype
relationship here;
e.g., all Circles are Shapes, but not
all Shapes are Circles.
– This kind of picture is also called a
UML class diagram.

18
Implementing an interface
public class name implements interface {
...
}
• Example:
public class Bicycle implements Vehicle {
...
}

• A class can declare that it implements an interface.


– This means the class must contain each of the abstract methods in that
interface. (Otherwise, it will not compile.)

19
Interface requirements
• If a class claims to be a Shape but doesn't implement the area and
perimeter methods, it will not compile.

• Example:
public class Banana implements Shape {
...
}

– The compiler error message:


Banana.java:1: Banana is not abstract and does
not override abstract method area() in Shape
public class Banana implements Shape {
^

20
Complete Circle class
// Represents circles.
public class Circle implements Shape {
private double radius;
// Constructs a new circle with the given radius.
public Circle(double radius) {
this.radius = radius;
}
// Returns the area of this circle.
public double area() {
return Math.PI * radius * radius;
}
// Returns the perimeter of this circle.
public double perimeter() {
return 2.0 * Math.PI * radius;
}
21
}
Complete Rectangle class
// Represents rectangles.
public class Rectangle implements Shape {
private double width;
private double height;
// Constructs a new rectangle with the given dimensions.
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
// Returns the area of this rectangle.
public double area() {
return width * height;
}
// Returns the perimeter of this rectangle.
public double perimeter() {
return 2.0 * (width + height);
}
22
}
Complete Triangle class
// Represents triangles.
public class Triangle implements Shape {
private double a;
private double b;
private double c;
// Constructs a new Triangle given side lengths.
public Triangle(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
// Returns this triangle's area using Heron's formula.
public double area() {
double s = (a + b + c) / 2.0;
return Math.sqrt(s * (s - a) * (s - b) * (s - c));
}
// Returns the perimeter of this triangle.
public double perimeter() {
return a + b + c;
}
}
23
Interfaces + polymorphism
• Interfaces don't benefit the class so much as the client.
– Interface's is-a relationship lets the client use polymorphism.

public static void printInfo(Shape s) {


System.out.println("The shape: " + s);
System.out.println("area : " + s.area());
System.out.println("perim: " + s.perimeter());
}

– Any object that implements the interface may be passed.


Circle circ = new Circle(12.0);
Rectangle rect = new Rectangle(4, 7);
Triangle tri = new Triangle(5, 12, 13);
printInfo(circ);
printInfo(tri);
printInfo(rect);

Shape[] shapes = {tri, circ, rect};


24
Another exercise
• Assume that the following classes have been declared:
public class Snow {
public void method2() {
System.out.println("Snow 2");
}
public void method3() {
System.out.println("Snow 3");
}
}
public class Rain extends Snow {
public void method1() {
System.out.println("Rain 1");
}
public void method2() {
System.out.println("Rain 2");
}
} 25
Exercise
public class Sleet extends Snow {
public void method2() {
System.out.println("Sleet 2");
super.method2();
method3();
}
public void method3() {
System.out.println("Sleet 3");
}
}
public class Fog extends Sleet {
public void method1() {
System.out.println("Fog 1");
}
public void method3() {
System.out.println("Fog 3");
}
}
26
Exercise
What happens when the following examples are executed?

• Example 1:
Snow var1 = new Sleet();
var1.method2();
• Example 2:
Snow var2 = new Rain();
var2.method1();
• Example 3:
Snow var3 = new Rain();
((Sleet) var3).method3();

27
Technique 1: diagram
• Diagram the classes from top (superclass) to bottom.

28
Technique 2: table
method Snow Rain Sleet Fog
method1 Rain 1 Fog 1

method2 Snow 2 Rain 2 Sleet 2 Sleet 2


Snow 2 Snow 2
method3() method3()
method3 Snow 3 Snow 3 Sleet 3 Fog 3

Italic - inherited behavior


Bold - dynamic method call

29
Example 1
• Example:
variable
Snow var1 = new Sleet();
var1.method2();

• Output: object

Sleet 2
Snow 2
Sleet 3

30
Example 2
• Example:
variable
Snow var2 = new Rain();
var2.method1();

• Output: object

None!
There is an error,
because Snow does not
have a method1.

31
Example 3
• Example:

Snow var3 = new Rain();


((Sleet) var3).method2();

• Output: object variable

None!
There is an error
because a Rain is
not a Sleet.

32
Abstract Classes
Abstract classes
• Abstract class is a class that cannot be instantiated, but that can serve
as a super class to hold common code and declare abstract behavior.
public abstract class <name> {

}
Example
public abstract class ShareAsset{
private String symbol;
private double totalCost;
private double currentPrice;

public ShareAsset(String symbol, double currentPrice) {


this.symbol = symbol;
this.currentPrice = currentPrice;
totalCost = 0.0;
}
}
ShareAsset asset = new ShareAsset(“MSFT”, 27.46); //error
• An attempt to create a ShareAsset object will produce a compiler error such as :
ShareAsset is abstract; cannot be instantiated
34
Abstract classes
• Abstract class can contain abstract methods and normal methods
– abstract method: A header without an implementation.
• The actual body is not specified, it is left to subclasses to provide it.

public abstract <type> <name>(<type> <name>,…, <type> <name>);

35
Abstract classes-example
• ShareAsset is an abstract class that implements Asset interface
– ShareAsset does not have to implement all the methods required by the interface Asset. Some of them can be declared
as abstract and left to subclasses to implement them.
– Subclasses should extends ShareAsset and should not implements Asset
// A general asset that has a symbol and holds shares.
public abstract class ShareAsset implements Asset {
private String symbol;
private double totalCost;
private double currentPrice;

// Constructs a new share asset with the given symbol and current price.
public ShareAsset(String symbol, double currentPrice) {
this.symbol = symbol;
this.currentPrice = currentPrice;
totalCost = 0.0;
}

// Returns the current market value of this asset (required by the interface).
public abstract double getMarketValue();

// Returns the profit earned on shares of this asset.


public double getProfit() {
// calls an abstract getMarketValue method (the subclass will provide its implementation)
return getMarketValue() - totalCost;
}

}

36

You might also like