Share PowerPoint. Anywhere!

cs1311xjava05 poly

Uploaded from authorPOINT Lite
Download as Download Not Available PPT
Presentation Description

No description available

Views: 19
Like it  ( Likes) Dislike it  ( Dislikes)
Added: November 15, 2007 This presentation is Public
Presentation Category :Entertainment
Tags Add Tags
Presentation StatisticsNew!
Views on authorSTREAM: 19
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