Chapter 8 Polymorphism Part I Slides prepared by Rose Williams,
17 Slides307.00 KB
Chapter 8 Polymorphism Part I Slides prepared by Rose Williams, Binghamton University
Introduction to Polymorphism There are three main programming mechanisms that constitute object-oriented programming (OOP) – Encapsulation – Inheritance – Polymorphism Polymorphism is the ability to associate many meanings to one method name – It does this through a special mechanism known as late binding or dynamic binding 2006 Pearson Addison-Wesley. All rights reserved 8-2
Introduction to Polymorphism Inheritance allows a base class to be defined, and other classes derived from it – Code for the base class can then be used for its own objects, as well as objects of any derived classes Polymorphism allows changes to be made to method definitions in the derived classes, and have those changes apply to the software written for the base class 2006 Pearson Addison-Wesley. All rights reserved 8-3
Late Binding The process of associating a method definition with a method invocation is called binding If the method definition is associated with its invocation when the code is compiled, that is called early binding If the method definition is associated with its invocation when the method is invoked (at run time), that is called late binding or dynamic binding 2006 Pearson Addison-Wesley. All rights reserved 8-4
Late Binding Java uses late binding for all methods (except private, final, and static methods) Because of late binding, a method can be written in a base class to perform a task, even if portions of that task aren't yet defined For an example, the relationship between a base class called Sale and its derived class DiscountSale will be examined 2006 Pearson Addison-Wesley. All rights reserved 8-5
The Sale and DiscountSale Classes The Sale class contains two instance variables – name: the name of an item (String) – price: the price of an item (double) It contains three constructors – A no-argument constructor that sets name to "No name yet", and price to 0.0 – A two-parameter constructor that takes in a String (for name) and a double (for price) – A copy constructor that takes in a Sale object as a parameter 2006 Pearson Addison-Wesley. All rights reserved 8-6
The Sale and DiscountSale Classes The Sale class also has a set of accessors (getName, getPrice), mutators (setName, setPrice), overridden equals and toString methods, and a static announcement method The Sale class has a method bill, that determines the bill for a sale, which simply returns the price of the item It has two methods, equalDeals and lessThan, each of which compares two sale objects by comparing their bills and returns a boolean value 2006 Pearson Addison-Wesley. All rights reserved 8-7
The Sale and DiscountSale Classes The DiscountSale class inherits the instance variables and methods from the Sale class In addition, it has its own instance variable, discount (a percent of the price), and its own suitable constructor methods, accessor method (getDiscount), mutator method (setDiscount), overriden toString method, and static announcement method The DiscountSale class has its own bill method which computes the bill as a function of the discount and the price 2006 Pearson Addison-Wesley. All rights reserved 8-8
The Sale and DiscountSale Classes The Sale class lessThan method – Note the bill() method invocations: public boolean lessThan (Sale otherSale) { if (otherSale null) { System.out.println("Error: null object"); System.exit(0); } return (bill( ) otherSale.bill( )); } 2006 Pearson Addison-Wesley. All rights reserved 8-9
The Sale and DiscountSale Classes The Sale class bill() method: public double bill( ) { return price; } The DiscountSale class bill() method: public double bill( ) { double fraction discount/100; return (1 - fraction) * getPrice( ); } 2006 Pearson Addison-Wesley. All rights reserved 8-10
The Sale and DiscountSale Classes Given the following in a program: . . . Sale simple new sale("floor mat", 10.00); DiscountSale discount new DiscountSale("floor mat", 11.00, 10); . . . if (discount.lessThan(simple)) System.out.println(" " discount.bill() " " " " simple.bill() " because late-binding works!"); . . . – Output would be: 9.90 10 because late-binding works! 2006 Pearson Addison-Wesley. All rights reserved 8-11
The Sale and DiscountSale Classes In the previous example, the boolean expression in the if statement returns true As the output indicates, when the lessThan method in the Sale class is executed, it knows which bill() method to invoke – The DiscountSale class bill() method for discount, and the Sale class bill() method for simple Note that when the Sale class was created and compiled, the DiscountSale class and its bill() method did not yet exist – These results are made possible by late-binding 2006 Pearson Addison-Wesley. All rights reserved 8-12
Pitfall: No Late Binding for Static Methods When the decision of which definition of a method to use is made at compile time, that is called static binding – This decision is made based on the type of the variable naming the object Java uses static, not late, binding with private, final, and static methods – In the case of private and final methods, late binding would serve no purpose – However, in the case of a static method invoked using a calling object, it does make a difference 2006 Pearson Addison-Wesley. All rights reserved 8-13
Pitfall: No Late Binding for Static Methods The Sale class announcement() method: public static void announcement( ) { System.out.println("Sale class"); } The DiscountSale class announcement() method: public static void announcement( ) { System.out.println("DiscountSale class"); } 2006 Pearson Addison-Wesley. All rights reserved 8-14
Pitfall: No Late Binding for Static Methods In the previous example, the the simple (Sale class) and discount (DiscountClass) objects were created Given the following assignment: simple discount; – Now the two variables point to the same object – In particular, a Sale class variable names a DiscountClass object 2006 Pearson Addison-Wesley. All rights reserved 8-15
Pitfall: No Late Binding for Static Methods Given the invocation: simple.announcement(); – The output is: Sale class Note that here, announcement is a static method invoked by a calling object (instead of its class name) – Therefore the type of simple is determined by its variable name, not the object that it references 2006 Pearson Addison-Wesley. All rights reserved 8-16
Pitfall: No Late Binding for Static Methods There are other cases where a static method has a calling object in a more inconspicuous way For example, a static method can be invoked within the definition of a nonstatic method, but without any explicit class name or calling object In this case, the calling object is the implicit this 2006 Pearson Addison-Wesley. All rights reserved 8-17