Java TOPIC – INTERFACES & POLYMORPHISM LESSON NOTE WHAT IS AN INTERFACE? An interface
is simply a listing of methods without method bodies. Some interfaces only have one method. The goal of this/these method(s) is to
provide a specific functionality or ability. EXAMPLE OF AN INTERFACE Below is an
example interface called Drawable. Notice that all is has is a listing of
three methods: draw, getWidth and getHeight. Notice
that none of the methods have method bodies. public interface Drawable
{ public void draw(); public int getWidth(); public int getHeight(); } WE CANNOT CREATE
INTERFACE OBJECTS We can’t
instantiate an interface which means we cannot create Drawable
objects. So you will never see Drawable d = new Drawable(); in your code. SO WHAT DOES IT DO? On its own,
an interface does nothing. We use
interfaces to define a specific functionality/ability for another class. For example,
the above interface Drawable specifies that the Drawable ability requires that the methods draw(), getWidth(), getHeight() get implemented. So a class that needs to be Drawable needs to have these methods in it. LET’S CONSIDER THIS
CLASS For the
purpose of using the Drawable interface, let’s
consider this simple Rectangle class: public class Rectangle { public int x,y,w,h; public Rectangle(int tx, int ty, int tw, int th) { x=tx; y=ty; w=tw; h=th; } } SO HOW DOES A CLASS USE
AN INTERFACE? An interface
is used by another class to give that class an ability. We do this by using the implements keyword. For example, we
can make the Rectangle class implement the Drawable
interface by adding the implements keyword at the end of the class header
(see below). public class Rectangle implements Drawable { //… } REQUIRED IMPLEMENTATIONS If you try
typing the above, you will notice that an error is detected. The reason is that for Rectangle to
implement Drawable, it needs to implement the
methods that are in Drawable. Below, you
see the methods from the interface added to the Rectangle class. public class Rectangle implements Drawable { public int x,y,w,h; public Rectangle(int tx, int ty, int tw, int th) { x=tx; y=ty; w=tw; h=th; } public void draw() { //code to draw
Rectangle goes here } public int getWidth() { //code that
returns the drawing width goes here } public int getHeight() { //code that
returns the drawing height goes here } } SO WHY USE INTERFACES? Ok. So interfaces force us to add methods in
classes that implement them. But we
could have added those methods anyway without any interface? So why bother using an interface? An interface
allows us to define an ability. This
ability provides a framework for all classes that need to be Drawable. All
classes that are (or will be) Drawable, need to
implement those methods. It’s a
standardization. This means that all
objects that are Drawable can be dealt with in the
same way. POPULAR INTERFACES –
COMPARABLE & ITERABLE Two of the
most known interfaces in Java are Comparable and Iterable. We can easily implement both of these in
our new classes. And many existing
classes also implement these interfaces. In fact,
other aspects of Java make use of these interfaces as well. Java’s Arrays.sort()
function, the famous sorting function for arrays, can actually sort any
objects that implement Comparable.
More on this in the next lesson. INTERFACE NAMES An interface
name should start with a capital letter.
Some people like Mr. Campeau tend to make sure that their name ends
with –able but that is in no way a requirement.
If you try to
look online for example tutorials relating to interfaces, you will find a lot
of examples that do not show a useful interface. While these are factually correct, they
tend to be quite confusing. An interface
is very easy to create. It’s only a
few lines long and provides us with a standard way of defining an ability. POLYMORPHISM – SINGLE
LINE We can do the
following: Drawable do =
new Rectangle(3, 4, 5, 6); This may seem
strange but we can have a Drawable reference to a
Rectangle object. We can only do this
because Rectangle is Drawable. The ability for a reference to refer to a
different type of object is called polymorphism
(the ability to take on different forms).
Such a reference is called a polymorphic
reference. Why might
this be useful? A method can
receive a Drawable object as parameter and then use
it. This method could be used with
different objects that are Drawable. This is convenient as we do not need to
create a new method for each type of object that is Drawable. The ability
for a Drawable reference to be made to another
object that implements Drawable is called
polymorphism. POLYMORPHISM – ARRAY Let’s imagine
that you are creating several classes that need to be drawn to screen. Let’s say their names are Rectangle,
Circle, House and Cloud – all things that we might want to draw. A good approach would be make every class
implement the Drawable interface similar to the one
in the example above. Once this is
done, we can actually create an array of type Drawable. This array can hold any object that has the
Drawable ability, in other words, any object whose
class implements Drawable. So we can do
something like this: Drawable[]
d = new Drawable[4]; d[0] = new Rectangle(10, 10, 5, 5); d[1] = new Sphere(20, 25, 8); d[2] = new Cloud(13, 38, 9); d[3] = new House(43, 39, 23, 48); for (int i=0; i<d.length; i++) { d[i].draw(); } The idea that
an object can take two different forms (Rectangle can also be a Drawable object) is called polymorphism. Notice how we
are conveniently able to process all Drawable
objects in the arrays with a simple for
loop. If we want, we can even
create other classes that implement Drawable and
then add objects of those classes to the same array and they would
automatically get drawn. ABOUT POLYMORPHIC REFERENCES Polymorphic
references such as Drawable do = new Rectangle(3, 4,
5, 6); can be very
convenient as discussed above. It
should be noted that we can only call methods that are in Drawable on the object do.
|