820 likes | 833 Views
Java Lecture 5. CS 1311X Our Story So Far The Story of O Inheritance, Polymorphism and Death in the Afternoon. 13 X 11. Our Story So Far. Object Oriented Programming Features Encapsulation Reusability Adaptability Object Oriented Programming Benefits Generic "Drop In" Components
E N D
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
Our Story So Far • Java Language Syntax • Class Structure • Fields • Constructors • Methods • Accessors • Modifiers • Special Concepts • toString • main • static
Our Story So Far • All objects are manipulated using references
The Story of O CS Version
The Story of O Object Oriented
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 • 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 • Overriding • Also called redefinition class A { int someMethod() } class B extends A int someMethod() }
The Story of O Everything is an Object!
Inheritance class Animal { String name; public Animal(String name) { this.name = name; } }
Inheritance class Dog extends Animal { int fleas; public Dog(String name, int fleas) { super(name); this.fleas = fleas; } }
Inheritance class Cat extends Animal { int hairBalls; public Cat(String name, int hairBalls) { super(name); this.hairBalls = hairBalls; } }
Inheritance (Deceptive Diagram) Animal Dog Cat
Inheritance (True Diagram) Object Animal Dog Cat
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 • Repetitive tasks • Collections of things (objects) • Baseball cards • Library items • Shapes • Animals • Vehicles • Students
Motivation • Collections are seldom uniform • Desire method of holding a collection of dissimilar items • Need to change the type mismatch rules
Recall float f; double d ; int i; String s; CokeMachine cm; f = d; // illegal d = f; // legal i = d; // illegal d = i; // legal
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 float f; double d ; int i; String s; CokeMachine cm; s = cm; // illegal cm = s; // illegal
Recall float f; double d ; int i; String s; CokeMachine cm; s = (String)cm; // illegal cm = (CokeMachine)s; // illegal
Inheritance Changes the Rules Object Animal Dog Cat
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 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
Ref: Dog d Step by Step Dog d
Ref: Dog d Step by Step Dog d = new Dog(); public Dog() { }
Ref: Dog d Step by Step Dog d = new Dog(); public Dog() { } public Animal() { }
Ref: Dog d Step by Step Dog d = new Dog(); public Dog() { } Object public Animal() { } public Object() { }
Ref: Dog d Step by Step Dog d = new Dog(); public Dog() { } Object Animal public Animal() { }
Ref: Dog d Step by Step Dog d = new Dog(); public Dog() { } Object Animal Dog
Ref: Dog d Step by Step Dog d = new Dog(); Object Animal Dog
Ref: Dog d Step by Step Dog d = new Dog(); Object Animal "A Dog Object" Dog
Ref: Animal a Quizlette Animal a = new Dog(); Object Animal "A Dog Object" Dog
Ref: Object o Quizlette Object o = new Dog(); Object Animal "A Dog Object" Dog
Ref: Dog d Quizlette Dog d = new Animal(); Object Animal "An Animal Object" ILLEGAL
Ref: Animal a Quizlette Animal a = new Object(); Object "An Object Object" ILLEGAL
Quizlette Dog d = new Object(); ?
Ref: Dog d Quizlette Dog d = new Object(); Object "An Object Object" ILLEGAL
Ref: Dog Ref: Object Ref: Object Ref: Dog d o o d Same Logic d = o; ? o = d; OK! ?
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!!! • 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 • 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? • 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 • 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(); Object Object Animal Object Animal Dog
Object toString() Animal Dog toString() Dynamic Binding • It even works like this... A Dog Object Ref: Animal a Animal a = new Dog(); a.toString();
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 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.
Object toString() Object toString() Object toString() Animal move() Animal move() Animal move() Dog move() toString() bark() Dog move() toString() bark() Dog move() toString() bark() 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(); o a d
Dog woof() Cat meow() Pig oink() Back to Collections • The simple approach Object