Conditional Expressions and Statements : 01/20/2023
Operations on Variables : 01/19/2023
Variables and Types : 01/18/2023
Welcome to CS 124 : 01/17/2023
Polymorphism
publicclassPet {
publicvoidspeak() {
System.out.println("I'm a pet!");
}
}
publicclassDogextendsPet {
publicvoidwoof() {
System.out.println("I'm a dog!");
}
}
publicclassCatextendsPet {
publicvoidmeow() {
System.out.println("I'm a cat!");
}
}
publicvoidspeak(Petpet) {
if (petinstanceofDogdog) {
dog.woof();
} elseif (petinstanceofCatcat) {
cat.meow();
} else {
pet.speak();
}
}
Next we’ll continue to practice with inheritance.
We’ll also introduce a new big (literally) idea—polymorphism.
Polymorphism may sound scary, but it’s not, and we’ll work it out together like we always do, using a lot of examples.
Polymorphism is a big word, and sounds a bit scary.
But it’s actually quite straightforward.
Let’s work it out together starting with the Wikipedia definition:
In programming languages and type theory, polymorphism is the provision of a single interface to entities of different types
One way to think about polymorphism and Java inheritance is to consider “is a” relationships.
For example, every instance of any Java class “is a” Object, because every class is a subclass of Object.
Other “is a” relationships depend on inheritance relationships established with extends:
When we create an instance of a class, we can save it into a variable of any type that it can morph into:
classPet { }
classDogextendsPet { }
Dogdog=newDog();
Petpet=newDog();
Objecto=newDog();
This is referred to as upcasting.
Java will automatically upcast an instance to any of its supertypes.
Because Dog extends Pet and Pet extends Object, a Dog can be stored in a Dog, Pet, or Object variable.
However!
The type of the variable determines what we can do with that object.
Let’s look at how.
classPet { }
classDogextendsPet { }
Dogdog=newDog();
Petpet=newDog();
Objecto=newDog();
Don’t worry if this seems a bit fuzzy now.
We’ll return to this topic a few lessons from now when we discuss object references.
Consider the type hierarchy established below:
Given a Pet variable, it might refer to a Dog, a Cat, a Pet or some other kind of pet!
classPet { }
classDogextendsPet {
voidbark() { }
}
classCatextendsPet {
voidmeow() { }
}
Petdog=newDog();
Petcat=newCat();
Petpet=newPet();
Is there a way that we can tell?
Yup!
To test if an object is an instance of a particular class, we use the instanceof operator.
And, once we determine that cat is actually an instance of Cat, there is another step that we have to take before we can call meow.
Let’s examine how that works:
The last two lessons have been pretty loaded with new ideas and concepts!
Exciting, but also enough to make your head spin.
Don’t worry.
Over the next two lessons we’ll slow down and review what we’ve learned.
And then, over the lessons that follow we’ll have even more opportunities to integrate this knowledge, but with a small twist.
So be patient.
This won’t all make sense immediately.
But it will all make sense eventually.