Presentation Transcript
Java Lecture 5 : 13X11 Java Lecture 5 CS 1311X
Our Story So Far
The Story of O
Inheritance, Polymorphism and Death in the Afternoon
Our Story So Far : 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
Our Story So Far : Our Story So Far Java Language Syntax
Class Structure
Fields
Constructors
Methods
Accessors
Modifiers
Special Concepts
toString
main
static
Our Story So Far : Our Story So Far All objects are manipulated using references
The Story of O : The Story of O CS Version
The Story of O : The Story of O Object Oriented
The Story of O : 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;
The Story of O : 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)
The Story of O : The Story of O Overriding
Also called redefinition
class A {
int someMethod()
}
class B extends A
int someMethod()
}
The Story of O : The Story of O Everything
is an
Object!
Inheritance : Inheritance class Animal
{
String name;
public Animal(String name)
{
this.name = name;
}
}
Inheritance : Inheritance class Dog extends Animal
{
int fleas;
public Dog(String name, int fleas)
{
super(name);
this.fleas = fleas;
}
}
Inheritance : Inheritance class Cat extends Animal
{
int hairBalls;
public Cat(String name, int hairBalls)
{
super(name);
this.hairBalls = hairBalls;
}
}
Inheritance (Deceptive Diagram) : Inheritance (Deceptive Diagram) Animal Cat Dog
Inheritance (True Diagram) : Inheritance (True Diagram) Animal Cat Dog Object
Truth Be Known : 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?
Motivation : Motivation Repetitive tasks
Collections of things (objects)
Baseball cards
Library items
Shapes
Animals
Vehicles
Students
Motivation : Motivation Collections are seldom uniform
Desire method of holding a collection of dissimilar items
Need to change the type mismatch rules
Recall : Recall float f;
double d ;
int i;
String s;
CokeMachine cm;
f = d; // illegal
d = f; // legal
i = d; // illegal
d = i; // legal
Recall : 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
Recall : Recall float f;
double d ;
int i;
String s;
CokeMachine cm;
s = cm; // illegal
cm = s; // illegal
Recall : Recall float f;
double d ;
int i;
String s;
CokeMachine cm;
s = (String)cm; // illegal
cm = (CokeMachine)s; // illegal
Inheritance Changes the Rules : Inheritance Changes the Rules Animal Cat Dog Object
Inheritance Changes the Rules : Inheritance Changes the Rules Object 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?
The Keyword is Extends : 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
Step by Step : Step by Step Dog d
Step by Step : Step by Step Dog d = new Dog(); public Dog()
{
}
Step by Step : Step by Step Dog d = new Dog(); public Dog()
{
} public Animal()
{
}
Step by Step : Step by Step Dog d = new Dog(); public Dog()
{
} public Animal()
{
} public Object()
{
} Object
Step by Step : Step by Step Dog d = new Dog(); public Dog()
{
} public Animal()
{
} Object Animal
Step by Step : Step by Step Dog d = new Dog(); public Dog()
{
} Object Animal Dog
Step by Step : Step by Step Dog d = new Dog(); Object Animal Dog
Step by Step : Step by Step Dog d = new Dog(); Object Animal Dog "A Dog Object"
Quizlette : Quizlette Animal a = new Dog(); Object Animal Dog "A Dog Object"
Quizlette : Quizlette Object o = new Dog(); Object Animal Dog "A Dog Object"
Quizlette : Quizlette Dog d = new Animal(); Object Animal "An Animal Object" ILLEGAL
Quizlette : Quizlette Animal a = new Object(); Object "An Object Object" ILLEGAL
Quizlette : Quizlette Dog d = new Object(); ?
Quizlette : Quizlette Dog d = new Object(); Object "An Object Object" ILLEGAL
Same Logic : Same Logic d = o; o = d; ? ? OK!
Don't be confused!!! : Don't be confused!!! Primitives
double d;
float f;
d = f; // legal...no loss of information
f = d; // illegal...potential loss of
// information
Don't be confused!!! : 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!!!
Warning : 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;
What's the Point? : 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.
Dynamic Binding : 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
Dynamic Binding : Dynamic Binding It even works like this...
Animal a = new Dog();
a.toString(); Ref: Animal a A Dog
Object
Trick #3 : 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.
Reference/Method Checking : 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.
More Quizlette Fun : More Quizlette Fun Object 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();
d a o
Back to Collections : Back to Collections The simple approach Object
Java Collections : Java Collections LinkedList
ArrayList
Vector
Stack
HashSet
TreeSet
HashTable
Plus you'll write lots on your own...
They all hold objects!
Using Generic Collections -- Poorly : Using Generic Collections -- Poorly 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();
if(o instanceOf Dog)
((Dog)o).bark();
if(o instanceOf Cat)
((Cat)o).meow();
if(o instanceOf Pig)
((Pig)o).oink();
}
Can We Do Better? : Can We Do Better? A first try Object
Using Generic Collections -- Betterly??? : 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???
}
Using Generic Collections -- Betterly??? : 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???
}
Mystery Partially Solved : Mystery Partially Solved
Using Generic Collections -- Correctly : Using Generic Collections -- Correctly LinkedList 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();
}
Software Engineering : 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
*/
}
How many will forget? : How many will forget?
Solution: Abstract Methods and Classes : Solution: Abstract Methods and Classes class Animal
{
public abstract void talk();
// Note: No body!
}
Result: Error!!!
Sometimes called a deferred
method...
Solution: Abstract Methods and Classes : Solution: Abstract Methods and Classes abstract class Animal
{
public abstract void talk();
// Note: No body!
}
Result: Okay.
Java Never Forgets : 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).
Concrete : Concrete class Dog extends Animal
{
public void talk()
{
bark();
}
}
Or : Or class Dog extends Animal
{
public void talk()
{
System.out.println("Bow wow!);
}
}
Just for the Record : Just for the Record abstract class Canine
{
// define other stuff?
}
Object Dog
talk() Cat
talk() Pig
talk() abstract Animal
abstract talk() abstract Canine
Wolf
talk()
Using Generic Collections -- Correctly : Using Generic Collections -- Correctly LinkedList 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 abstract Animal
abstract talk()
Design Guidelines : 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!
Back to the Problem at Hand : Back to the Problem at Hand
Coke Machines Available : Coke Machines Available CokeMachine
Standard Model
Requires Exact Change
Low Cost
Coke Machines Available : Coke Machines Available CokeMachine2000
Deluxe Model
Makes Change
Intermediate Cost
Coke Machines Available : Coke Machines Available CokeMachineUA
(Urban Assault)
Secure Model
Makes Change
High Cost
Tamper Proof
The Vending Machine Hierarchy : The Vending Machine Hierarchy VendingMachine
vend()
load()
vandalize()
toString() CokeMachine
vandalize()
toString() CokeMachine2000
vend()
vandalize()
toString() CokeMachineUA
vandalize()
toString() abstract
The Players : 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
The Players : The Players Person
interact()
toString() Student
interact() Instructor
interact() Dean
interact() abstract
Algorithm : 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
The Simulation : The Simulation machines population p.interact(v) p v if still
alive
Heart of Simulation : Heart of Simulation p = (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);
Without Polymorphism? : Without Polymorphism? Imagine what would have to happen in interaction without polymorphism
if Student
if CokeMachine
else if CokeMachine2000
else if CokeMachineUA
else if Instructor
if CokeMachine
else if CokeMachine2000
else if CokeMachineUA
elseif Dean
if CokeMachine
else if CokeMachine2000
else if CokeMachineUA
Service : Service if((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;
}
Demo : Demo
Catch the
buzz on authorSTREAM
Copyright © 2002-2008 authorSTREAM. All rights reserved.