Chapter 9 Interfaces and Polymorphism. Chapter Goals To learn about interfaces To be able to convert between class and interface references To understand.

Slides:



Advertisements
Similar presentations
METHOD OVERRIDING 1.Sub class can override the methods defined by the super class. 2.Overridden Methods in the sub classes should have same name, same.
Advertisements

Chapter 13 ARRAY LISTS AND ARRAYS. CHAPTER GOALS To become familiar with using array lists to collect objects To learn about common array algorithms To.
Chapter 13 ARRAY LISTS AND ARRAYS CHAPTER GOALS –To become familiar with using array lists to collect objects –To learn about common array algorithms –To.
Chapter 11 – Interfaces and Polymorphism. Chapter Goals Learn about interfaces Learn about interfaces Convert between class and interface references Convert.
Interfaces and polymorphism Chapter 9. Interfaces  Used to express operations common to more than one purpose.  Example: You want to find the maximum.
Interfaces and Polymorphism Lesson - 8. Objectives Interfaces Supertype and subtype references Polymorphism Inner classes.
Chapter 9 – Interfaces and Polymorphism Big Java by Cay Horstmann Copyright © 2009 by John Wiley & Sons. All rights reserved.
Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Chapter Nine: Interfaces and Polymorphism.
Computer Science A 9: 3/11. Inheritance Today: Inheritance (JC – CCJ ) I have to leave at 11am (but you can stay)
What is an Interface?? An interface is a ‘container’ which contains ONLY abstract methods. public interface Capitalizable { public abstract String outCaps()
Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Interfaces and Polymorphism.
Chapter 8 – Interfaces and Polymorphism Big Java by Cay Horstmann Copyright © 2009 by John Wiley & Sons. All rights reserved.
Chapter 3 Implementing Classes. Instance Variables Instance variables store the data of an object; the fields of an object. Instance of a class: an object.
Chapter 13 Inheritance. An Introduction to Inheritance Inheritance: extend classes by adding methods and fields (variables) Example: Savings account =
Big Java by Cay Horstmann Copyright © 2009 by John Wiley & Sons. All rights reserved. Chapter Three - Implementing Classes.
Lecture 17 Abstract classes Interfaces The Comparable interface Event listeners All in chapter 10: please read it.
Interfaces. Lecture Objectives To learn about interfaces To be able to convert between class and interface references To appreciate how interfaces can.
CHAPTER 2 OBJECTS AND CLASSES Goals: To understand the concepts of classes and objects To realize the difference between objects and object references.
Interfaces. Lecture Objectives To learn about interfaces To be able to convert between class and interface references To appreciate how interfaces can.
Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Chapter Nine: Interfaces and Polymorphism.
Chapter 2 storing numbers and creating objects Pages in Horstmann.
Datalogi A 2: 15/9. Java Slides based on Horstmann chapter 2&3 Objects and classes Import, methods, references Implementing a class.
Polymorphism. Lecture Objectives To understand the concept of polymorphism To understand the concept of static or early binding To understand the concept.
Inheritance Part II. Lecture Objectives To learn about inheritance To understand how to inherit and override superclass methods To be able to invoke superclass.
Chapter 9  Interfaces and Polymorphism 1 Chapter 9 Interfaces and Polymorphism.
Object Oriented Programming, Interfaces, Callbacks Delegates and Events Dr. Mike Spann
Chapter 6 Iteration.  Executes a block of code repeatedly  A condition controls how often the loop is executed while (condition) statement  Most commonly,
Chapter 6: Iteration Part 2. Create triangle pattern [] [][] [][][] [][][][] Loop through rows for (int i = 1; i
Chapter 6 Iteration. Chapter Goals To be able to program loops with the while, for, and do statements To avoid infinite loops and off-by-one errors To.
Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse Defining an Interface implementing an interface 9.2 Converting between Class.
What is an Interface?? An interface is a ‘class’ which contains ONLY abstract methods. public interface Capitalizable { public abstract String outCaps()
Programming With Java ICS201 University Of Hail1 Chapter 13 Interfaces.
INTERFACES More OO Concepts. Interface Topics Using an interface Interface details –syntax –restrictions Create your own interface Remember polymorphism.
Chapter 9 Interfaces and Polymorphism. Chapter Goals To learn about interfaces To be able to convert between class and interface references To understand.
Copyright © 2014 by John Wiley & Sons. All rights reserved.1 Chapter 10 - Interfaces.
Copyright © 2014 by John Wiley & Sons. All rights reserved.1 Interfaces.
1 final (the keyword, not the exam). 2 Motivation Suppose we’ve defined an Employee class, and we don’t want someone to come along and muck it up  E.g.,
1 CSC 222: Computer Programming II Spring 2005 Java interfaces & polymorphism  Comparable interface  defining an interface  implementing an interface.
Chapter 9 Interfaces and Polymorphism. Chapter Goals To learn about interfaces To be able to convert between class and interface references To understand.
Fall 2006Adapted from Java Concepts Companion Slides1 Interfaces and Polymorphism Advanced Programming ICOM 4015 Lecture 10 Reading: Java Concepts Chapter.
CHAPTER 9 INTERFACES AND POLYMORPHISM Chapter Goals: –To learn about interfaces –To be able to convert between supertype and subtype references –To understand.
CHAPTER 9 INTERFACES AND POLYMORPHISM. CHAPTER GOALS To learn about interfaces To be able to convert between supertype and subtype references To understand.
1 COSC2007 Data Structures II Chapter 9 Class Relationships.
Lecture Notes – Inheritance and Polymorphism (Ch 9-10) Yonglei Tao.
ICOM 4015 Fall 2008 Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. ICOM 4015: Advanced Programming Lecture 9 Chapter.
Drew University1 Interfaces and Polymorphism 9.1 Developing Reusable Solutions 9.2 Converting between Types 9.3 Polymorphism Common Error 9.1 Advanced.
Chapter 8 Class Inheritance and Interfaces F Superclasses and Subclasses  Keywords: super F Overriding methods  The Object Class  Modifiers: protected,
Chapter 4 Interface Types and Polymorphism: Graphics, Timer, Animation.
Chapter 9 – Interfaces and Polymorphism Big Java by Cay Horstmann Copyright © 2009 by John Wiley & Sons. All rights reserved.
Topics Instance variables, set and get methods Encapsulation
Chapter 8 – Interfaces and Polymorphism Big Java by Cay Horstmann Copyright © 2009 by John Wiley & Sons. All rights reserved.
Chapter 3 Implementing Classes
9.1 CLASS (STATIC) VARIABLES AND METHODS Defining classes is only one aspect of object-oriented programming. The real power of object-oriented programming.
Java Programming: Guided Learning with Early Objects Chapter 9 Inheritance and Polymorphism.
Chapter 7 Iteration. Chapter Goals To be able to program loops with the while, for, and do statements To avoid infinite loops and off-by-one errors To.
EE2E1. JAVA Programming Lecture 4 Interfaces. Contents Interfaces – introduction Interfaces – introduction Example – generic sorting Example – generic.
Lecture 3 John Woodward.
Lecture 14 Throwing Custom Exceptions
Chapter Goals To be able to declare and use interface types
Lecture Notes – Interface and Polymorphism (Ch 9-10)
Interfaces and Polymorphism
Chapter 11 – Interfaces and Polymorphism
Chapter Three - Implementing Classes
Chapter 11 Interfaces and Polymorphism
Group Status Project Status.
Chapter 7 Iteration.
Constructors, GUI’s(Using Swing) and ActionListner
Chapter 14 Abstract Classes and Interfaces
Object Oriented Programming
Introduction to Computer Science and Object-Oriented Programming
Presentation transcript:

Chapter 9 Interfaces and Polymorphism

Chapter Goals To learn about interfaces To be able to convert between class and interface references To understand the concept of polymorphism To appreciate how interfaces can be used to decouple classes To learn how to implement helper classes as inner classes To understand how inner classes access variables from the surrounding scope To implement event listeners for timer events

Creating a DataSet class In this topic, we’ll use a DataSet class for illustrative purposes. This class is intended to take a set of numbers as input, and to return the average and the maximum of that set of numbers. It’s described in Chapter 7 in the Horstmann book.

/** Computes average and max of a set of data values. */ public class DataSet{ private double sum; private double maximum; private int count; /** Constructs an empty data set. */ 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++; } /** Gets the average of the added data. */ public double getAverage(){ if (count == 0) { return 0;} else { return sum / count; } } /** Gets the maximum of the added data. */ public double getMaximum() { return maximum; } } // end of class

Using the DataSet class to average numbers import java.util.Scanner; /** This program computes the average and maximum of a set of input values. */ public class DataSetTester{ public static void main(String[] args){ Scanner in = new Scanner(System.in); DataSet data = new DataSet(); boolean done = false; while (!done){ System.out.print("Enter value, Q to quit: "); String input = in.next(); if (input.equalsIgnoreCase("Q")){ done = true; }else{ double x = Double.parseDouble(input); data.add(x); } System.out.println("Average = " + data.getAverage()); System.out.println("Maximum = " + data.getMaximum()); }

Using Interfaces for Code Reuse The DataSet is able to find the average and maximum of a set of values (doubles only) What if we want to find the average and maximum of a set of BankAccount values? Or of Coin values? Or Dice values? We use interface types to make code more reusable Continued…

First attempt: modify DataSet for BankAccounts public class DataSet{ // Modified for BankAccount objects private double sum; private BankAccount maximum; private int count; private int count; public void add(BankAccount x){ sum = sum + x.getBalance(); if (count == 0 || maximum.getBalance() < x.getBalance()) maximum = x; count++; } public double getAverage(){ if (count == 0) { return 0;} else { return sum / count; } } public BankAccount getMaximum() { return maximum; } }

Using Interfaces for Code Reuse Or suppose we wanted to find the coin with the highest value among a set of coins. We would need to modify the DataSet class again Continued…

Modify DataSet for Coin class public class DataSet{ // Modified for Coin objects private double sum; private Coin maximum; private int count; private int count; public void add(Coin x){ sum = sum + x.getValue(); if (count == 0 || maximum.getBalance() < x.getValue()){ maximum = x; } count++; } public double getAverage(){ if (count == 0) { return 0;} else { return sum / count; } } public Coin getMaximum() { return maximum; } }

Using Interfaces for Code Reuse The mechanics of analyzing the data is the same in all cases; details of measurement differ Classes could agree on a method getMeasure that obtains the measure to be used in the analysis We can implement a single reusable DataSet class whose add method looks like this: sum = sum + x.getMeasure(); if (count == 0 || maximum.getMeasure() < x.getMeasure()) maximum = x; count++; Continued…

Using Interfaces for Code Reuse What is the type of the variable x? x should refer to any class that has a getMeasure method In Java, an interface type is used to specify required operations Interface declaration lists all methods (and their signatures) that the interface type requires public interface Measurable { double getMeasure(); }

Interfaces vs. Classes An interface type is similar to a class, but there are several important differences: All methods in an interface type are abstract; they don't have an implementation All methods in an interface type are automatically public An interface type does not have instance fields (instance variables).

Generic dataset for Measureable Objects public class DataSet { private double sum; private Measurable maximum; private int count;... public void add(Measurable x){ sum = sum + x.getMeasure(); if (count == 0 || maximum.getMeasure() < x.getMeasure()) maximum = x; count++; } public Measurable getMaximum() { return maximum; } }

Implementing an Interface Type Use implements keyword to indicate that a class implements an interface type A class can implement more than one interface type  Class must define all the methods that are required by all the interfaces it implements public class BankAccount implements Measurable { public double getMeasure() { return balance; } // Additional methods and fields }

Implementing an Interface Type Another example: public class Coin implements Measurable { public double getMeasure() { return value; }... }

UML Diagram of Dataset and Related Classes Figure 2: UML Diagram of Dataset Class and the Classes that Implement the Measurable Interface

Syntax 11.1: Defining an Interface public interface InterfaceName { // method signatures } Example: public interface Measurable { double getMeasure(); } Purpose: To define an interface and its method signatures. The methods are automatically public.

Syntax 11.2: Implementing an Interface public class ClassName implements InterfaceName, InterfaceName,... { // methods // instance variables } Example: public class BankAccount implements Measurable { // Other BankAccount methods public double getMeasure() { // Method implementation } Purpose: To define a new class that implements the methods of an interface

File DataSetTester.java /** This program tests the DataSet class. */ public class DataSetTester{ 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("Avg balance= "+bankData.getAverage()); Measurable max = bankData.getMaximum(); System.out.println(“Max 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("Avg coin value="+coinData.getAverage()); max = coinData.getMaximum(); System.out.println(“Max coin value = " + max.getMeasure()); } }

File DataSetTester.java Avg balance = Max balance = Avg coin value = Max coin value = 0.25 Output:

Self Check 1.Suppose you want to use the DataSet class to find the Country object with the largest population. What condition must the Country class fulfill? 2.Why can't the add method of the DataSet class have a parameter of type Object ?

Answers 1.It must implement the Measurable interface, and its getMeasure method must return the population 2.The Object class doesn't have a getMeasure method, and the add method invokes the getMeasure method

Converting Between Class and Interface Types You can convert from a class type to an interface type, provided the class implements the interface BankAccount account = new BankAccount(10000); Measurable x = account; // OK Coin dime = new Coin(0.1, "dime"); Measurable x = dime; // Also OK Continued…

Converting Between Class and Interface Types Cannot convert between unrelated types Because Rectangle doesn't implement Measurable Measurable x = new Rectangle(5, 10, 20, 30); // ERROR

Casts Add coin objects to DataSet What can you do with it? It's not of type Coin DataSet coinData = new DataSet(); coinData.add(new Coin(0.25, "quarter")); coinData.add(new Coin(0.1, "dime"));... Measurable max = coinData.getMaximum(); // Get the largest coin String name = max.getName(); // ERROR Continued…

Casts You need a cast to convert from an interface type to a class type You know it's a coin, but the compiler doesn't. Apply a cast: If you are wrong and max isn't a coin, the compiler throws an exception Coin maxCoin = (Coin) max; String name = maxCoin.getName();

Casts Difference with casting numbers:  When casting number types you agree to the information loss  When casting object types you agree to that risk of causing an exception

Self Check 3.Can you use a cast ( BankAccount ) x to convert a Measurable variable x to a BankAccount reference? 4.If both BankAccoun t and Coin implement the Measurable interface, can a Coin reference be converted to a BankAccount reference?

Answers 3.Only if x actually refers to a BankAccount object. 4.No–a Coin reference can be converted to a Measurable reference, but if you attempt to cast that reference to a BankAccount, an exception occurs.

Polymorphism Interface variable holds reference to object of a class that implements the interface Measurable x ; Note that the object to which x refers doesn't have type Measurable ; the type of the object is some class that implements the Measurable interface Continued… x = new BankAccount(10000); x = new Coin(0.1, "dime");

Polymorphism You can call any of the interface methods: Which method is called? double m = x.getMeasure();

Polymorphism Depends on the actual object. If x refers to a bank account, calls BankAccount.getMeasure If x refers to a coin, calls Coin.getMeasure Polymorphism (many shapes): Behavior can vary depending on the actual type of an object Continued…

Self Check 5.Why is it impossible to construct a Measurable object? 6.Why can you nevertheless declare a variable whose type is Measurable ? 7.What do overloading and polymorphism have in common? Where do they differ?

Answers 5. Measurable is an interface. Interfaces have no fields and no method implementations. 6.That variable never refers to a Measurable object. It refers to an object of some class–a class that implements the Measurable interface. Continued…

Answers 7.Both describe a situation where one method name can denote multiple methods. However, overloading is resolved early by the compiler, by looking at the types of the parameter variables. Polymorphism is resolved late, by looking at the type of the implicit parameter object just before making the call.

Processing Timer Events javax.swing.Timer generates equally spaced timer events Useful whenever you want to have an object updated in regular intervals Sends events to interface java.awt.event.ActionListener; public interface ActionListener { void actionPerformed(ActionEvent event); } Continued…

Processing Timer Events Define a class that implements the ActionListener interface class MyListener implements ActionListener { void actionPerformed(ActionEvent event) { // This action will be executed at each timer event Place listener action here } } Continued…

Processing Timer Events Add listener to timer Every tick of the timer object, it sends an “event” signal to the listener object. That listener object then executes whatever is inside its “actionPerformed” method. MyListener listener = new MyListener(); Timer t = new Timer(interval, listener); t.start();

Example: Countdown Example: a timer that counts down to zero Figure 3: Running the TimeTester Program

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JOptionPane; import javax.swing.Timer; class CountDown implements ActionListener{ private int count; public CountDown(int initialCount) { count = initialCount; } public void actionPerformed(ActionEvent event){ if (count >= 0){ System.out.println(count); } if (count == 0){ System.out.println("Liftoff!");} count--; } /** This program tests the Timer class. */ public class TimerTester{ public static void main(String[] args){ CountDown listener = new CountDown(10); final int DELAY = 1000; // Milliseconds between ticks Timer t = new Timer(DELAY, listener); t.start(); JOptionPane.showMessageDialog(null, "Quit?"); System.exit(0); }

Self Check 13.Why does a timer require a listener object? 14.How many times is the actionPerformed method called in the preceding program?

Answers 13.The timer needs to call some method whenever the time interval expires. It calls the actionPerformed method of the listener object. 14.It depends. The method is called once per second. The first eleven times, it prints a message. The remaining times, it exits silently. The timer is only terminated when the user quits the program.

Inner Classes We can define classes inside other classes or methods. Methods of inner classes can access variables that are defined in surrounding scope Useful when implementing event handlers Example: Animation Ten times per second, we will move a shape to a different position Continued…

Accessing Surrounding Variables class Mover implements ActionListener { public void actionPerformed(ActionEvent event) { // Move the rectangle } } ActionListener listener = new Mover(); final int DELAY = 100; // Milliseconds between timer ticks Timer t = new Timer(DELAY, listener); t.start();

Accessing Surrounding Variables The actionPerformed method can access variables from the surrounding scope, like this: public static void main(String[] args) {... final Rectangle box = new Rectangle(5, 10, 20, 30); class Mover implements ActionListener { public void actionPerformed(ActionEvent event) { // Move the rectangle box.translate(1, 1); } }... }

Accessing Surrounding Variables Local variables that are accessed by an inner-class method must be declared as final Inner class can access fields of surrounding class that belong to the object that constructed the inner class object An inner class object created inside a static method can only access static surrounding fields

File TimeTester2.java 01: import java.awt.Rectangle; 02: import java.awt.event.ActionEvent; 03: import java.awt.event.ActionListener; 04: import javax.swing.JOptionPane; 05: import javax.swing.Timer; 06: 07: /** 08: This program uses a timer to move a rectangle once per second. 09: */ 10: public class TimerTester2 11: { 12: public static void main(String[] args) 13: { 14: final Rectangle box = new Rectangle(5, 10, 20, 30); 15: 16: class Mover implements ActionListener 17: { Continued…

File TimeTester2.java 18: public void actionPerformed(ActionEvent event) 19: { 20: box.translate(1, 1); 21: System.out.println(box); 22: } 23: } 24: 25: ActionListener listener = new Mover(); 26: 27: final int DELAY = 100; // Milliseconds between timer ticks 28: Timer t = new Timer(DELAY, listener); 29: t.start(); 30: 31: JOptionPane.showMessageDialog(null, "Quit?"); 32: System.out.println("Last box position: " + box); 33: System.exit(0); 34: } 35: }

File TimeTester2.java java.awt.Rectangle[x=6,y=11,width=20,height=30] java.awt.Rectangle[x=7,y=12,width=20,height=30] java.awt.Rectangle[x=8,y=13,width=20,height=30]... java.awt.Rectangle[x=28,y=33,width=20,height=30] java.awt.Rectangle[x=29,y=34,width=20,height=30] Last box position: java.awt.Rectangle[x=29,y=34,width=20,height=30] Output:

Self Check 15.Why would an inner class method want to access a variable from a surrounding scope? 16.If an inner class accesses a local variable from a surrounding scope, what special rule applies?

Answers 15.Direct access is simpler than the alternative–passing the variable as a parameter to a constructor or method. 16.The local variable must be declared as final.