Presentation is loading. Please wait.

Presentation is loading. Please wait.

Interfaces and Polymorphism

Similar presentations


Presentation on theme: "Interfaces and Polymorphism"— Presentation transcript:

1 Interfaces and Polymorphism
Developing Reusable Solutions Converting between Types Polymorphism Drew University

2 Interface A Java interface declares a set of methods and their signatures. Unlike a class, it provides no implementation. (meaning it has no code, just the first line of each method) To realize (implement) an interface, a class must supply all the methods that the interface requires. Drew University

3 public interface Comparable
Method Summary  intcompareTo(Object o) Compares this object with another.  If you want your class to be Comparable, it needs a compareTo method that takes in an Object and returns an integer. Drew University

4 Example String implements Comparable
We can compare two strings by invoking the String method compareTo. String makes a promise to "define" what is means to compare two String objects. String s1 = <some string>; String s2 = <some string>; if (s2.compareTo(s1))……. Drew University

5 Examples { } public int compareTo(Object o)
If we want to compare two circles, we must supply the method compareTo. public class Circle implements Comparable { public int compareTo(Object o) // Circle must define what it means to compare two Circle objects. } Drew University

6 Examples public class Circle implements Comparable {
public int compareTo(Object o) Circle c = (Circle) o; if (this.equals(c)) return 0; if (this.radius < c.radius) return -1; return 1; } … // we have already defined equals for Circle. What if equals is not defined for Circle? this is not required here. Drew University

7 How do you compare students?
Examples public class Student implements Comparable { public int compareTo(Object o) } How do you compare students? Drew University

8 Examples public class Student implements Comparable {
public int compareTo(Object o) Student s = (Student) o; if (this.equals(s)) return 0; if (this.getGPA() < s.getGPA()) return -1; else return 1; } Drew University

9 I’m a Person, I’m a Graduate, I’m an Achiever..
An interface….. "To be useful, an interface must be realized (implemented) by at least one Java class." – Rick Mercer A class may implement MANY interfaces. I’m a Person, I’m a Graduate, I’m an Achiever.. Drew University

10 A picture (BlueJ) <<Flier>> fly() <<Athlete>>
train() SkiJumper fly() train() compareTo() Bird fly() findHome() Airplane fly() Engine Drew University

11 Interfaces SHOULD NOT GROW once defined!
Classes have "contracts" with an interface. If the interface changes, all classes that realize the interface are affected. Interfaces allow for encapsulating similar behaviors between unrelated classes. Drew University

12 Interface Contains constants, methods or both.
NO implementations. (no code) No instance variables. Drew University

13 Using interfaces Define a set of methods as an interface.
Classes that realize the interface must support all the methods of the interface. Create classes that implement those methods. The Compiler will verify that method calls are valid. Drew University

14 Interface Example public interface Flier { void fly(); }
Drew University

15 Interface declarations:
All methods in an interface are public. The methods in the interface are not declared as public because they are public by default. When implementing the methods of the interface in a class, include the keyword public. Drew University

16 Classes realizing Flier
public class Bird implements Flier { public void fly() System.out.println("Using my wings to fly"); } ================================================================== public class Airplane implements Flier System.out.println("Using my jet engines to fly"); public class SkiJumper implements Flier, Athlete, Comparable System.out.println("Using skis to take me into the air"); Drew University

17 Abstract An interface is ABSTRACT.
You can’t create an object of that type. Drew University

18 Interfaces Cannot be instantiated. Flier f = new Flier();NO You can use interface name as variable type; variable can refer to an object of any class that implements the interface. Flier b = new Bird();OK Flier s = new SkiJumper();OK Drew University

19 Using interfaces Interfaces define types (sets of methods).
A variable of type Flier must refer to an object that implements methods defined by Flier, not necessarily to an instance of Flier. Actual method invoked is defined by the object’s class, at run-time. (dynamic binding) Drew University

20 polymorphism… Dynamic Binding (overriding): Behavior can vary depending on the actual type of an object. Occurs at runtime. Early Binding (overloading) occurs at compile time. Drew University

21 polymorphism "In the object-oriented world, polymorphism refers to the ability of different kinds of objects to respond differently to the same commands, provided that the objects belong to classes with a common ancestor." K.N.King Drew University

22 Again… Early binding of methods occurs if the compiler selects a method from several possible candidates as with overloaded methods. Late binding occurs if the method selection takes place when the program runs. Drew University

23 The importance of IS-A You can convert from a class type to an interface type if the class realizes the interface. String str = "word"; Comparable p = str; // OK You need a cast to convert from an interface type to a class type. Comparable p = str; String t = p; // NO Drew University

24 The importance of IS-A You can convert from a class type to an interface type if the class realizes the interface. String str = "word"; Comparable p = str; // OK You need a cast to convert from an interface type to a class type. Comparable p = str; String t = (String)p; // OK Drew University

25 instanceof operator The instanceof operator tests whether an object belongs to a particular type. What happens? Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier instanceof SkiJumper) System.out.println("That's right."); else System.out.println("NOT"); Drew University

26 instanceof operator The instanceof operator tests whether an object belongs to a particular type. What happens? Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier instanceof SkiJumper) System.out.println("That's right."); else System.out.println("NOT"); That's right. Drew University

27 instanceof operator The instanceof operator tests whether an object belongs to a particular type. What happens? Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier instanceof Flier) System.out.println("That's right."); else System.out.println("NOT"); Drew University

28 instanceof operator The instanceof operator tests whether an object belongs to a particular type. Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier instanceof Flier) System.out.println("That's right."); else System.out.println("NOT"); That's right. Drew University

29 instanceof operator The instanceof operator tests whether an object belongs to a particular type. What happens? Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier2 instanceof Flier) System.out.println("That's right."); else System.out.println("NOT"); Drew University

30 instanceof operator The instanceof operator tests whether an object belongs to a particular type. Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier2 instanceof Flier) System.out.println("That's right."); else System.out.println("NOT"); That's right. Drew University

31 instanceof operator The instanceof operator tests whether an object belongs to a particular type. What happens? Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier2 instanceof SkiJumper) System.out.println("That's right."); else System.out.println("NOT"); Drew University

32 instanceof operator The instanceof operator tests whether an object belongs to a particular type. Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier2 instanceof SkiJumper) System.out.println("That's right."); else System.out.println("NOT"); NOT Drew University

33 Polymorphism is NOT Overloading.
Method signature refers to method name and parameters Overloading means methods have different signatures(different parameters). Overloading usually occurs in same class. BankAccount has two constructors. One of the constructors has one double parameter. One of the constructors has no parameters. The compiler chooses the appropriate method. Drew University

34 Polymorphism The actual type of the object determines which method is to be called. This is late binding (dynamic binding). The virtual machine, not the compiler, selects the appropriate method at run time. Drew University

35 Consider the following DataSet class.
//Computes the average of a set of // data values. public class DataSet { public DataSet() sum = 0; count = 0; maximum = 0; } //Adds a data value to the data // set public void add(double x) sum = sum + x; if (count == 0 || maximum < x) maximum = x; count++; //Returns the average of the added data. public double getAverage() { if (count == 0) return 0; else return sum / count; } //Returns the largest of the added data // or 0 if no data has been added public double getMaximum() return maximum; private double sum; private double maximum; private int count; Drew University

36 Concerns Suppose we wanted to find the BankAccount with the highest balance? Suppose we wanted to find the Coin with the highest value? Suppose we wanted to find the Student with the highest gpa? Drew University

37 Solution: //Computes the average of a set of // data values.
public class DataSet { public DataSet() sum = 0; count = 0; maximum = 0; } //Adds a data value to the data // set public void add(BankAccount x) sum = sum + x.getBalance(); if (count == 0 || maximum.getBalance() < x.getBalance()) maximum = x; count++; //Returns the average of the added data. public double getAverage() { if (count == 0) return 0; else return sum / count; } //Returns the largest of the added data // or 0 if no data has been added public BankAccount getMaximum() return maximum; private double sum; private BankAccount maximum; private int count; Drew University

38 Solution: //Computes the average of a set of // data values.
public class DataSet { public DataSet() sum = 0; count = 0; maximum = 0; } //Adds a data value to the data // set public void add(Coin x) sum = sum + x.getValue(); if (count == 0 || maximum.getValue () < x.getValue ()) maximum = x; count++; //Returns the average of the added data. public double getAverage() { if (count == 0) return 0; else return sum / count; } //Returns the largest of the added data // or 0 if no data has been added public Coin getMaximum() return maximum; private double sum; private Coin maximum; private int count; Drew University

39 Solution: //Computes the average of a set of // data values.
public class DataSet { public DataSet() sum = 0; count = 0; maximum = 0; } //Adds a data value to the data // set public void add(Student x) sum = sum + x.getGpa(); if (count == 0 || maximum.getGpa () < x.getGpa ()) maximum = x; count++; //Returns the average of the added data. public double getAverage() { if (count == 0) return 0; else return sum / count; } //Returns the largest of the added data // or 0 if no data has been added public Student getMaximum() return maximum; private double sum; private Student maximum; private int count; Drew University

40 Hmmmmm… Clearly the mechanics of analyzing the data is the same in ALL cases but the details of measurement are different. BankAccount : balance Coin: value Student: gpa Drew University

41 Suppose we consider the following:
public interface Measurable { double getMeasure(); } Drew University

42 Solution: //Computes the average of a set of // data values.
public class DataSet { public DataSet() sum = 0; count = 0; maximum = 0; } //Adds a data value to the data // set public void add(Measurable x) sum = sum + x.getMeasure(); if (count == 0 || maximum.getMeasure () < x.getMeasure ()) maximum = x; count++; //Returns the average of the added data. public double getAverage() { if (count == 0) return 0; else return sum / count; } //Returns the largest of the added data // or 0 if no data has been added public Measurable getMaximum() return maximum; private double sum; private Measurable maximum; private int count; Drew University

43 And… public class BankAccount implements Measurable { . . . . .
public double getMeasure() { return balance; } Drew University

44 Test class public class DataSetTest {
public static void main(String[] args) DataSet bankData = new DataSet(); bankData.add(new BankAccount(0)); bankData.add(new BankAccount(10000)); bankData.add(new BankAccount(2000)); System.out.println("Average balance = " + bankData.getAverage()); Measurable max = bankData.getMaximum(); System.out.println("Highest balance = " + max.getMeasure()); DataSet coinData = new DataSet(); coinData.add(new Coin(0.25, "quarter")); coinData.add(new Coin(0.1, "dime")); coinData.add(new Coin(0.05, "nickel")); System.out.println("Average coin value = " + coinData.getAverage()); max = coinData.getMaximum(); String name = ((Coin)max).getName(); System.out.println(name + " has the highest coin value of " + max.getMeasure()); } Drew University

45 And… public class Coin implements Measurable { . . . . .
public double getMeasure() { return value; } Drew University

46 And… public class Student implements Measurable { . . . . .
public double getMeasure() { return gpa; } Drew University


Download ppt "Interfaces and Polymorphism"

Similar presentations


Ads by Google