Upload
dwight-smith
View
219
Download
1
Embed Size (px)
Citation preview
13X1113X11
Java Lecture 5
CS 1311X
Our Story So Far
The Story of O
Inheritance, Polymorphism and Death in the Afternoon
13X11
Our Story So Far
• Object Oriented Programming Features– Encapsulation– Reusability– Adaptability
• Object Oriented Programming Benefits– Generic "Drop In" Components– Modeling Real World Objects– Handling Collections Easily
13X11
Our Story So Far
• Java Language Syntax• Class Structure
– Fields– Constructors– Methods
• Accessors• Modifiers
– Special Concepts• toString• main• static
13X11
Our Story So Far
• All objects are manipulated using references
13X11
The Story of O
CS Version
13X11
The Story of O
Object Oriented
13X11
The Story of O
• Operator Overloading
int a = 3;
int b = 2;
int c;
String x = "Hello ";
String y = "World!";
String z;
c = a + b;
z = x + y;
13X11
The Story of O
• Other Overloading– Constructor
public Student(String name, double gpa)
public Student(String name)– Method
public int max(int a, int b)
public int max(int a, int b, int c)
public int max(short a, short b)
13X11
The Story of O
• Overriding– Also called redefinition
class A {
int someMethod()
}
class B extends A
int someMethod()
}
13X11
The Story of O
Everything
is an
Object!
13X11
Inheritanceclass Animal
{
String name;
public Animal(String name)
{
this.name = name;
}
}
13X11
Inheritanceclass Dog extends Animal
{
int fleas;
public Dog(String name, int fleas)
{
super(name);
this.fleas = fleas;
}
}
13X11
Inheritanceclass Cat extends Animal
{
int hairBalls;
public Cat(String name, int hairBalls)
{
super(name);
this.hairBalls = hairBalls;
}
}
13X11
Inheritance (Deceptive Diagram)
Animal
CatDog
13X11
Inheritance (True Diagram)
Animal
CatDog
Object
13X11
Truth Be Known
• Class Object exists• It defines lots of useful methods
– e.g. toString– see the API
• Thus every class is either – a direct subclass of Object (no extends)
or– a subclass of a descendant of Object (extends)
• So what?
13X11
Motivation
• Repetitive tasks
• Collections of things (objects)– Baseball cards– Library items– Shapes– Animals– Vehicles– Students
13X11
Motivation
• Collections are seldom uniform
• Desire method of holding a collection of dissimilar items
• Need to change the type mismatch rules
13X11
Recall
float f;
double d ;
int i;
String s;
CokeMachine cm;
f = d; // illegal
d = f; // legal
i = d; // illegal
d = i; // legal
13X11
Recall
float f;
double d ;
int i;
String s;
CokeMachine cm;
f = (float)d; // legal
d = f; // legal
i = (int)d; // legal
d = i; // legal
13X11
Recall
float f;
double d ;
int i;
String s;
CokeMachine cm;
s = cm; // illegal
cm = s; // illegal
13X11
Recall
float f;
double d ;
int i;
String s;
CokeMachine cm;
s = (String)cm; // illegal
cm = (CokeMachine)s; // illegal
13X11
Inheritance Changes the Rules
Animal
CatDog
Object
13X11
Inheritance Changes the RulesObject o;
Animal a;
Dog d = new Dog();
Cat c = new Cat();
d = c; // illegal
a = c; // OK, a Cat is an Animal
o = c; // OK, a Cat is an Object
o = a; // OK, an Animal is an Object
a = o; // Illegal, not all Objects are Animals
d = a; // Illegal, not all animals are Dogs
Confusing?
13X11
The Keyword is Extends
Object creation process
Dog d = new Dog();
1. Create reference d
2. Start creating Dog by entering Dog constructor and making call to parent.
3. Start creating Animal by entering Animal constructor and making call to parent.
4. Create Object portion
5. Create Animal portion
6. Create Dog portion
13X11
Step by Step
d
Ref: Dog
Dog d
13X11
Step by Step
d
Ref: Dog
Dog d = new Dog();public Dog(){
}
13X11
Step by Step
d
Ref: Dog
Dog d = new Dog();public Dog(){
}
public Animal(){
}
13X11
Step by Step
d
Ref: Dog
Dog d = new Dog();public Dog(){
}
public Animal(){
}
public Object(){
}
Object
13X11
Step by Step
d
Ref: Dog
Dog d = new Dog();public Dog(){
}
public Animal(){
}
Object
Animal
13X11
Step by Step
d
Ref: Dog
Dog d = new Dog();public Dog(){
}Object
Animal
Dog
13X11
Step by Step
d
Ref: Dog
Dog d = new Dog();
Object
Animal
Dog
13X11
Step by Step
d
Ref: Dog
Dog d = new Dog();
Object
Animal
Dog
"A Dog Object"
13X11
Quizlette
a
Ref: Animal
Animal a = new Dog();
Object
Animal
Dog
"A Dog Object"
13X11
Quizlette
o
Ref: Object
Object o = new Dog();
Object
Animal
Dog
"A Dog Object"
13X11
Quizlette
d
Ref: Dog
Dog d = new Animal();
Object
Animal "An Animal Object"
ILLEGAL
13X11
Quizlette
a
Ref: Animal
Animal a = new Object();
Object
"An Object Object"
ILLEGAL
13X11
Quizlette
Dog d = new Object();
?
13X11
Quizlette
d
Ref: Dog
Dog d = new Object();
Object
"An Object Object"
ILLEGAL
13X11
Same Logic
d
Ref: Dogd = o;
o = d;
o
Ref: Object
o
Ref: Object
d
Ref: Dog
?
?OK!
13X11
Don't be confused!!!
• Primitives
double d;
float f;
d = f; // legal...no loss of information
f = d; // illegal...potential loss of
// information
13X11
Don't be confused!!!
•References
Object o;
Dog d;
o = d; // legal (a dog is an object)
d = o; // illegal (all objects are not
// dogs)
Note: Not the same as primitives...they are all just references!!!
13X11
Warning
• When you break the aforementioned rules...
• Java sometimes tells you that a cast is required
• Even if it's a real bad idea
Pearls p;
Swine s;
p = (Pearls)s;
13X11
What's the Point?
• Java Philosophy: Catch errors at compile time.
• Leading to tricky concept #2: Dynamic Binding
• At run time (dynamic) when a method is invoked on a reference the ACTUAL OBJECT is examined and the "lowest" or closest version of the method is actually run.
13X11
Dynamic Binding
• The heart of polymorphism
• Assume Animal and Dog have a toString method
Object o = new Dog();
Animal a = new Dog();
Dog d = new Dog();
o.toString();
a.toString();
d.toString();
((Object)o).toString();
Animal
Object
Dog
Animal
Object
Object
13X11
Dynamic Binding
• It even works like this...
Object toString()
Animal
Dog toString()
Animal a = new Dog();a.toString();
Ref: Animal
a
A Dog Object
13X11
Trick #3
• Java checks types at compile time when assigning references (Run time checking is also performed).
• Java always decides the method to be invoked by looking at the object at runtime.
• At compile time Java checks method invocations to make sure that the reference type will have the correct method. This may appear contradictory to dynamic binding.
13X11
Reference/Method Checking
x.y();
• x is a reference which has a type which is its class• That class (or a superclass) must have method y
or a compile error will result.
13X11
More Quizlette FunObject o = new Dog();
Animal a = new Dog();
Dog d = new Dog();
o.toString();
o.move();
o.bark();
a.toString();
a.move();
a.bark();
d.toString();
d.move();
d.bark();
Object toString()
Animal move()
Dog move() toString() bark()
Object toString()
Animal move()
Dog move() toString() bark()
Object toString()
Animal move()
Dog move() toString() bark()
d
a
o
13X11
Back to Collections
• The simple approach
Object
Dog woof()
Cat meow()
Pig oink()
13X11
Java Collections
• LinkedList• ArrayList• Vector• Stack• HashSet• TreeSet• HashTable• Plus you'll write lots on your own...
• They all hold objects!
13X11
Using Generic Collections -- PoorlyLinkedList zoo = new LinkedList();
Object o = new Dog();
Pig p = new Pig();
zoo.add(o);
zoo.add(new Cat());
zoo.add(p);
while(zoo.size() > 0) {
o = zoo.removeFirst();
if(o instanceOf Dog)
((Dog)o).bark();
if(o instanceOf Cat)
((Cat)o).meow();
if(o instanceOf Pig)
((Pig)o).oink();
}
13X11
Can We Do Better?
• A first try
Object
Dog talk()
Cat talk()
Pig talk()
13X11
Using Generic Collections -- Betterly???LinkedList zoo = new LinkedList();
Object o = new Dog();
Pig p = new Pig();
zoo.add(o);
zoo.add(new Cat());
zoo.add(p);
while(zoo.size() > 0) {
o = zoo.removeFirst();
o.talk(); // Does this work???
}
13X11
Using Generic Collections -- Betterly???LinkedList zoo = new LinkedList();
Object o = new Dog();
Pig p = new Pig();
zoo.add(o);
zoo.add(new Cat());
zoo.add(p);
while(zoo.size() > 0) {
o = zoo.removeFirst();
((???))o.talk(); // Does this work???
}
13X11
Mystery Partially Solved
Object
Dog talk()
Cat talk()
Pig talk()
Animal talk()
13X11
Using Generic Collections -- CorrectlyLinkedList zoo = new LinkedList();
Animal a = new Dog();
Object o = new Dog();
Pig p = new Pig();
zoo.add(a);
zoo.add(o);
zoo.add(new Cat());
zoo.add(p);
while(zoo.size() > 0) {
o = zoo.removeFirst();
((Animal))o.talk();
}
13X11
Software Engineering
• What should the talk method in class Animal do?
public void talk()
{
/*
* Make sure you redefine this method in
* your individual animal subclasses
*/
}
13X11
How many will forget?
13X11
Solution: Abstract Methods and Classesclass Animal
{
public abstract void talk();
// Note: No body!
}
Result: Error!!!
Sometimes called a deferredmethod...
13X11
Solution: Abstract Methods and Classesabstract class Animal
{
public abstract void talk();
// Note: No body!
}
Result: Okay.
13X11
Java Never Forgets
• Any subclass of class Animal has two choices:
– Define a talk method (i.e. { })
– Be abstract
• Note: Abstract classes may not be used to instantiate or make objects (new)
• References to abstract classes are legal (and quite desireable).
13X11
Concreteclass Dog extends Animal
{
public void talk()
{
bark();
}
}
13X11
Orclass Dog extends Animal
{
public void talk()
{
System.out.println("Bow wow!);
}
}
13X11
Just for the Recordabstract class Canine
{
// define other stuff?
}
Object
Dog talk()
Cat talk()
Pig talk()
abstract Animal abstract talk()
abstract Canine
Wolf talk()
13X11
Using Generic Collections -- CorrectlyLinkedList zoo = new LinkedList();
Animal a = new Dog();
Object o = new Dog();
Pig p = new Pig();
zoo.add(a);
zoo.add(o);
zoo.add(new Cat());
zoo.add(p);
while(zoo.size() > 0) {
o = zoo.removeFirst();
((Animal))o.talk();
}
Object
Dog talk()
Cat talk()
Pig talk()
abstract Animal abstract talk()
13X11
Design Guidelines
• Class hierarchy design is important– Move common methods up the tree– Use abstract methods appropriately– May be iterative process
• Container classes should generally hold Objects• Learn and understand the Java rules concerning
– Type checking– Reference checking– Dynamic binding
• You'll be glad you did!
13X11
Back to the Problem at Hand
13X11
Coke Machines Available
•CokeMachine
•Standard Model•Requires Exact Change•Low Cost
13X11
Coke Machines Available
•CokeMachine2000
•Deluxe Model•Makes Change•Intermediate Cost
13X11
Coke Machines Available
•CokeMachineUA (Urban Assault)
•Secure Model•Makes Change•High Cost
•Tamper Proof
13X11
The Vending Machine Hierarchy
VendingMachine vend() load() vandalize() toString()
CokeMachine vandalize() toString()
CokeMachine2000 vend() vandalize() toString()
CokeMachineUA vandalize() toString()abstract
13X11
The Players
• Students– Normally have change & dollar bills
• Instructors– Just have change (and not much of that)
• Deans– Have lots of money– If machine is out of coke, will vandalize machine
13X11
The Players
Person interact() toString()
Student interact()
Instructor interact()
Dean interact()
abstract
13X11
Algorithm• Create population of Students, Instructors and Deans
adding each to population LinkedList• Create group of machines adding to machines LinkedList• Loop in time
– Dequeue a person– Dequeue a machine– Allow them to interact (capture statistics)– If the person is still living
• Enqueue them back into population– Enqueue machine– If time for service
• Randomly select and service one machine
13X11
The Simulation
machinespopulation
p.interact(v)
p v
if stillalive
13X11
Heart of Simulationp = (Person)population.removeFirst();
v = (VendingMachine)machines.removeFirst();
result = p.interact(v);
stats[result + 2]++;
if(result >= -1)
{
population.addLast(p);
}
else
{
System.out.println("Another one bites the dust!");
}
machines.addLast(v);
13X11
Without Polymorphism?• Imagine what would have to happen in interaction without polymorphism
if Studentif CokeMachineelse if CokeMachine2000else if CokeMachineUA
else if Instructorif CokeMachineelse if CokeMachine2000else if CokeMachineUA
elseif Deanif CokeMachineelse if CokeMachine2000else if CokeMachineUA
13X11
Serviceif((time % SERVICE) == 0)
{
int chg;
int random;
int siz = machines.size();
VendingMachine vs;
random = (int)(siz * Math.random());
vs = (VendingMachine)machines.get(random);
vs.load(CASE);
chg = STARTUPCHANGE - vs.getChange();
chg = vs.addChange(chg);
startup += chg;
}
13X11
Demo
13X11
13X11