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

3 Week3 Java Polymorphism

The document discusses dynamic dispatch and polymorphism in Java, explaining how subclasses can inherit and override methods from parent classes. It emphasizes the importance of runtime polymorphism, where the method invoked is determined by the object's actual type rather than its declared type. Additionally, it covers type casting and reflection as means to manage static type restrictions.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views

3 Week3 Java Polymorphism

The document discusses dynamic dispatch and polymorphism in Java, explaining how subclasses can inherit and override methods from parent classes. It emphasizes the importance of runtime polymorphism, where the method invoked is determined by the object's actual type rather than its declared type. Additionally, it covers type casting and reflection as means to manage static type restrictions.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 26

Dynamic dispatch and polymorphism

Madhavan Mukund
https://www.cmi.ac.in/~madhavan

Programming Concepts using Java


Week 3
Subclasses and inheritance
public class Employee{
A subclass extends a parent class private String name;
private double salary;
Subclass inherits instance variables
public boolean setName(String s){ ... }
and methods from the parent class public boolean setSalary(double x){ ... }
public String getName(){ ... }
Subclasses cannot see private public double getSalary(){ ... }
components of parent class
public double bonus(float percent){
Subclass can add more instance return (percent/100.0)*salary;
variables and methods }
}

public class Manager extends Employee{


private String secretary;
public boolean setSecretary(name s){ ... }
public String getSecretary(){ ... }
}
Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 2/8
Subclasses and inheritance
public class Employee{
A subclass extends a parent class private String name;
private double salary;
Subclass inherits instance variables
public boolean setName(String s){ ... }
and methods from the parent class public boolean setSalary(double x){ ... }
public String getName(){ ... }
Subclasses cannot see private public double getSalary(){ ... }
components of parent class
public double bonus(float percent){
Subclass can add more instance return (percent/100.0)*salary;
variables and methods }
}
Can also override methods
public class Manager extends Employee{
private String secretary;
public boolean setSecretary(name s){ ... }
public String getSecretary(){ ... }
}
Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 2/8
Dynamic dispatch
Manager can redefine bonus()
double bonus(float percent){
return 1.5*super.bonus(percent);
}

Uses parent class bonus() via super


Overrides definition in parent class

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 3/8
Dynamic dispatch
Manager can redefine bonus()
double bonus(float percent){
return 1.5*super.bonus(percent);
}

Uses parent class bonus() via super


Overrides definition in parent class

Consider the following assignment


Employee e = new Manager(...)

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 3/8
Dynamic dispatch
Manager can redefine bonus()
double bonus(float percent){
return 1.5*super.bonus(percent);
}

Uses parent class bonus() via super


Overrides definition in parent class

Consider the following assignment


Employee e = new Manager(...)

Can we invoke e.setSecretary()?


e is declared to be an Employee
Static typechecking — e can only
refer to methods in Employee
Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 3/8
Dynamic dispatch
Manager can redefine bonus() What about e.bonus(p)? Which
double bonus(float percent){ bonus() do we use?
return 1.5*super.bonus(percent); Static: Use Employee.bonus()
}
Dynamic: Use Manager.bonus()
Uses parent class bonus() via super
Overrides definition in parent class

Consider the following assignment


Employee e = new Manager(...)

Can we invoke e.setSecretary()?


e is declared to be an Employee
Static typechecking — e can only
refer to methods in Employee
Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 3/8
Dynamic dispatch
Manager can redefine bonus() What about e.bonus(p)? Which
double bonus(float percent){ bonus() do we use?
return 1.5*super.bonus(percent); Static: Use Employee.bonus()
}
Dynamic: Use Manager.bonus()
Uses parent class bonus() via super
Dynamic dispatch (dynamic binding,
Overrides definition in parent class late method binding, . . . ) turns out to
Consider the following assignment be more useful
Default in Java, optional in languages
Employee e = new Manager(...)
like C++ (virtual function)
Can we invoke e.setSecretary()?
e is declared to be an Employee
Static typechecking — e can only
refer to methods in Employee
Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 3/8
Polymorphism

Every Employee in emparray Employee[] emparray = new Employee[2];


“knows” how to calculate its bonus Employee e = new Employee(...);
correctly! Manager e = new Manager(...);

emparray[0] = e;
emparray[1] = m;

for (i = 0; i < emparray.length; i++){


System.out.println(emparray[i].bonus(5.0);
}

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 4/8
Polymorphism

Every Employee in emparray Q := make-queue(first event)


“knows” how to calculate its bonus repeat
correctly! remove next event e from Q
simulate e
Recall the event simulation loop that place all events generated
motivated Simula to introduce by e on Q
objects until Q is empty

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 4/8
Polymorphism

Every Employee in emparray Employee[] emparray = new Employee[2];


“knows” how to calculate its bonus Employee e = new Employee(...);
correctly! Manager e = new Manager(...);
Recall the event simulation loop that emparray[0] = e;
motivated Simula to introduce emparray[1] = m;
objects
for (i = 0; i < emparray.length; i++){
Also referred to as runtime System.out.println(emparray[i].bonus(5.0);
polymorphism or inheritance }
polymorphism

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 4/8
Functions, signatures and overloading

Signature of a function is its name and


the list of argument types

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 5/8
Functions, signatures and overloading

Signature of a function is its name and


the list of argument types
Can have different functions with the
same name and different signatures
For example, multiple constructors

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 5/8
Functions, signatures and overloading

Signature of a function is its name and double[] darr = new double[100];


the list of argument types int[] iarr = new int[500];
...
Can have different functions with the Arrays.sort(darr);
same name and different signatures // sorts contents of darr
Arrays.sort(iarr);
For example, multiple constructors // sorts contents of iarr
Java class Arrays has a method sort
to sort arbitrary scalar arrays

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 5/8
Functions, signatures and overloading

Signature of a function is its name and double[] darr = new double[100];


the list of argument types int[] iarr = new int[500];
...
Can have different functions with the Arrays.sort(darr);
same name and different signatures // sorts contents of darr
Arrays.sort(iarr);
For example, multiple constructors // sorts contents of iarr
Java class Arrays has a method sort
to sort arbitrary scalar arrays class Arrays{
...
Made possible by overloaded methods public static void sort(double[] a){..}
defined in class Arrays // sorts arrays of double[]
public static void sort(int[] a){..}
// sorts arrays of int[]
...
}
Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 5/8
Functions, signatures and overloading

Overloading: multiple methods, double[] darr = new double[100];


different signatures, choice is static int[] iarr = new int[500];
...
Arrays.sort(darr);
// sorts contents of darr
Arrays.sort(iarr);
// sorts contents of iarr

class Arrays{
...
public static void sort(double[] a){..}
// sorts arrays of double[]
public static void sort(int[] a){..}
// sorts arrays of int[]
...
}
Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 6/8
Functions, signatures and overloading

Overloading: multiple methods, double[] darr = new double[100];


different signatures, choice is static int[] iarr = new int[500];
...
Overriding: multiple methods, same Arrays.sort(darr);
signature, choice is static // sorts contents of darr
Arrays.sort(iarr);
Employee.bonus() // sorts contents of iarr
Manager.bonus()
class Arrays{
...
public static void sort(double[] a){..}
// sorts arrays of double[]
public static void sort(int[] a){..}
// sorts arrays of int[]
...
}
Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 6/8
Functions, signatures and overloading

Overloading: multiple methods, double[] darr = new double[100];


different signatures, choice is static int[] iarr = new int[500];
...
Overriding: multiple methods, same Arrays.sort(darr);
signature, choice is static // sorts contents of darr
Arrays.sort(iarr);
Employee.bonus() // sorts contents of iarr
Manager.bonus()

Dynamic dispatch: multiple methods, class Arrays{


...
same signature, choice made at
public static void sort(double[] a){..}
run-time // sorts arrays of double[]
public static void sort(int[] a){..}
// sorts arrays of int[]
...
}
Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 6/8
Type casting

Consider the following assignment


Employee e = new Manager(...)

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 7/8
Type casting

Consider the following assignment


Employee e = new Manager(...)

Can we get e.setSecretary() to


work?
Static type-checking disallows this

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 7/8
Type casting

Consider the following assignment


Employee e = new Manager(...)

Can we get e.setSecretary() to


work?
Static type-checking disallows this

Type casting — convert e to Manager


((Manager) e).setSecretary(s)

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 7/8
Type casting

Consider the following assignment


Employee e = new Manager(...)

Can we get e.setSecretary() to


work?
Static type-checking disallows this

Type casting — convert e to Manager


((Manager) e).setSecretary(s)

Cast fails (error at run time) if e is not


a Manager

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 7/8
Type casting

Consider the following assignment Can test if e is a Manager


Employee e = new Manager(...) if (e instanceof Manager){
((Manager) e).setSecretary(s);
Can we get e.setSecretary() to }
work?
Static type-checking disallows this

Type casting — convert e to Manager


((Manager) e).setSecretary(s)

Cast fails (error at run time) if e is not


a Manager

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 7/8
Type casting

Consider the following assignment Can test if e is a Manager


Employee e = new Manager(...) if (e instanceof Manager){
((Manager) e).setSecretary(s);
Can we get e.setSecretary() to }
work?
A simple example of reflection in Java
Static type-checking disallows this
“Think about oneself”
Type casting — convert e to Manager
((Manager) e).setSecretary(s)

Cast fails (error at run time) if e is not


a Manager

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 7/8
Type casting

Consider the following assignment Can test if e is a Manager


Employee e = new Manager(...) if (e instanceof Manager){
((Manager) e).setSecretary(s);
Can we get e.setSecretary() to }
work?
A simple example of reflection in Java
Static type-checking disallows this
“Think about oneself”
Type casting — convert e to Manager
((Manager) e).setSecretary(s) Can also use type casting for basic
types
Cast fails (error at run time) if e is not
double d = 29.98;
a Manager int nd = (int) d;

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 7/8
Summary

A subclass can override a method from a parent class


Dynamic dispatch ensures that the most appropriate method is called, based on the
run-time identity of the object
Run-time/inheritance polymorphism, different from overloading
We will later see another type of polymorphism, structural polymorphism
For instance, use the same sorting function for array of any datatype that supports a
comparison operation
Java uses the term generics for this

Use type-casting (and reflection) overcome static type restrictions

Madhavan Mukund Dynamic dispatch and polymorphism Programming Concepts using Java 8/8

You might also like