Download presentation
Presentation is loading. Please wait.
Published byAshlee Sheila Gaines Modified over 9 years ago
1
Inheritance Like father like son Image from: http://www.latimes.com/includes/ramirez/ramirez_20031125.gif
2
2 Inheritance Sometimes classes have commonalities Consider a checking/savings/cd account Consider a janitor/sales clerk/manager Inheritance is a way of writing common code once, and using it in many classes Commonalities are captured in a super-class Also known as a base class or parent class Differences are captured in sub-classes Also known as a child class Image from: http://www.glenbard.net/Glenbard_East/Activities/media/GIFs/Businessman%20yelling%20into%20b.gif
3
3 Inheritance Software reuse is at the heart of inheritance The sub-class class inherits all properties of the parent all methods all variables Inheritance relationships can be depicted in a UML class diagram boxes represent classes lines represent relationships between classes an arrow with an open arrowhead pointing to the parent class indicates inheritance
4
4 Inheritance Inheritance creates an is-a relationship The child is a more specific kind of the parent Vehicle Car class Car extends Vehicle { // more data and methods } class Vehicle { // data and methods } UML Diagram indicating inheritance Java code indicating inheritance Motorcycle class Motorcycle extends Vehicle { // more data and methods }
5
5 Inheritance Syntax: public class SubClass extends SuperClass { // data and methods } Read “SubClass is a specialized version of SuperClass” All Oval’s have width and height Circle is a specialized oval since the width and height are always the same.
6
6 Class Hierarchies A child class of one parent can be the parent of another child, forming a class hierarchy Business WebBasedMaAndPa ServiceBusiness HomeBasedService RetailBusiness
7
7 The super Reference Constructors are NOT inherited A child’s constructor is responsible for calling the parent’s constructor The word super can be used as a method to mean “the parent classes constructor” can be used as a direct reference to the super class The first line of a child’s constructor should use the super reference to call the parent’s constructor
8
8 The super Reference class Account { protected double balance; Account(double openingBalance) { balance = openingBalance; } class MoneyMarketAccount extends Account { protected double annualInterestRate; MoneyMarketAccount(double openingBalance, double rate) { balance = openingBalance; // could you do this annualInterestRate = rate; // could you do this? } image from http://www.gamasutra.com/features/designers_notebook/superman.gif
9
9 The super Reference class Account { protected double balance; Account(double openingBalance) { balance = openingBalance; } class MoneyMarketAccount extends Account { protected double annualInterestRate; MoneyMarketAccount(double openingBalance, double rate) { super(openingBalance); // should do this annualInterestRate = rate; // should do this } image from http://www.menzies.us/ img/superman.gif
10
10 import java.awt.Color; public class RedDot extends Oval { public RedDot( int x, int y, int d ) { super(x, y, d, d); setBackground( Color.red ); } public void flatten() { setSize(getWidth()+1, getHeight()-1); repaint(); } // assume a Jframe named window RedDot dotty = new RedDot(10, 20, 5); window.add(dotty,0); dotty.repaint(); dotty.setLocation(20, 30); dotty.flatten(); Oval +void setLocation(int, int) +void setSize(int, int) +void setBackground(Color) +int getX() +int getY() +Color getBackground() +Oval(int, int, int, int) RedDot +RedDot(int,int,int) +void flatten() Example
11
11 Conformance When performing assignment “x = y;” Y must conform to X If X and Y are primitives then the type of y must be the identical to the type of X OR widen to the type of X Otherwise The class of Y must be identical to the class of X OR the class of Y must be a subclass of X
12
12 Overriding Methods A method in a super-class can be overridden in a sub-class. The sub-class method must have exactly the same signature same access, return type, name, formal parameter list The sub-classes method is able to re-define the behavior of the super-class method http://gladstone.uoregon.edu/~edetzler/n.w.riding/images/fly.gif
13
Overriding 13 Oval +setSize(int w, int h) … Target +setSize(int w, int h) … Oval s1 = new Oval(x,y,w,h); … s1.setSize(30, 30); Oval s1 = new Oval(x,y,w,h); … s1.setSize(30, 30); Target t1 = new Oval(x,y,w,h); … t1.setSize(30, 30); Target t1 = new Oval(x,y,w,h); … t1.setSize(30, 30);
14
14 Dynamic Dispatch Mechanism used to determine which method to actually call Determined at run time The class of the actual calling object is determined If that class contains the specified method, then execute it, otherwise look in the super-class for the method. Repeat if needed!
15
15 Overriding Example 1 class A { int i, j; A(int a, int b) { i = a; j = b; } void show() { System.out.println(“i and j: “ + i + “,” + j); } class B extends A { int k; B(int a, int b, int c) { super(a, b); k = c; } void show() { System.out.println(“k: “ + k); } class Example { public static void main(String[] args) { B aBThing = new B(1,2,3); aBThing.show(); }
16
Consider A +A() +void jabberwock() C +C() +void jabberwock() B +B() +void jabberwock() D +D() +void jabberwock() public void foo(A jubJub) { jubJub.jabberwock(); } … foo(new A()); // OK? foo(new B()); // OK? foo(new C()); // OK? foo(new D()); // OK? public void foo(A jubJub) { jubJub.jabberwock(); } … foo(new A()); // OK? foo(new B()); // OK? foo(new C()); // OK? foo(new D()); // OK? Compile time: an object is treated as it’s declared type. Compiler ensures that the runtime code will work – not what the runtime code exactly means! Runtime: an object is treated according to it’s actual (most specific) type! Compile time: an object is treated as it’s declared type. Compiler ensures that the runtime code will work – not what the runtime code exactly means! Runtime: an object is treated according to it’s actual (most specific) type!
17
17 Overriding Example 2 class A { public void foo() { System.out.println(“inside foo A”); } class B extends A { public void foo() { System.out.println(“inside foo B”); } class C extends B { public void foo() { System.out.println(“inside foo C”); } class Demo { public static void main(String[] args) { A a = new A(); B b = new B(); C c = new C(); A reference; reference = a; reference.foo(); reference = b; reference.foo(); reference = c; reference.foo(); }
18
18 public class BasicCheckbook { protected int balance; // in cents /* postcondition balance == bd*100 + bc */ public BasicCheckbook(int bd, int bc) { balance = bd*100 + bc; } /* postcondition balance == old balance + dd*100 + dc */ public void deposit(int dd, int dc) { balance = balance + dd*100 + dc; } /* postcondition balance == old balance - (wd*100 + wc) */ public void withdraw(int wd, int wc) { balance = balance - (wd*100 + wc); } /* postcondition result == balance */ public int balanceInCents() { return balance; } BasicCheckbook # balance : int «constructor» + BasicCheckbook( int, int) «update» + deposit( int, int) + withdraw( int, int) «query» + balanceInCents() : int Image from: http://www.southernunited.com/sufi_images/page1/checkbook.jpg
19
19 public class CheckbookWithStrBalance extends BasicCheckbook { public CheckbookWithStrBalance(int bd, int bc) { super(bd, bc); } public String toString() { String dollarStr, centStr; int cents; dollarStr = "" + (balance / 100); cents = balance % 100; if (cents < 10) { centStr = "0" + cents; } else { centStr = "" + cents; } return "$" + dollarStr + "." + centStr; } BasicCheckbook # balance : int «constructor» + BasicCheckbook( int, int) «update» + deposit( int, int) + withdraw( int, int) «query» + int balanceInCents() CheckbookWithStrBalance «constructor» + CheckbookWithStr...( int, int) «query» + String toString()
20
20 public class CheckbookWithTotals extends CheckbookWithStrBalance { protected int depositTot, withdrawTot; public CheckbookWithTotals(int bd, int bc) { super(bd, bc); depositTot = 0; withdrawTot = 0; } public void deposit(int dd, int dc) { super.deposit(dd, dc); depositTot = depositTot + dd*100 + dc; } public void withdraw(int wd, int wc) { super.withdraw(wd, wc); withdrawTot = withdrawTot - (wd*100 + wc); } public int deposits() { return depositTot; } public int withdraws() { return withdrawTot; } BasicCheckbook # int balance «constructor» + BasicCheckbook( int, int) «update» + deposit( int, int) + withdraw( int, int) «query» + int balanceInCents() CheckbookWithStrBalance «constructor» + CheckbookWith...( int, int) «query» + String toString() CheckbookWithTotals # int depositTot # int withdrawTot «constructor» + CheckbookWithTotals( int, int) «update» + deposit( int, int) + withdraw( int, int) «query» + int deposits() + int withdraws()
21
21 Permit overdraft (negative balance) (charge $10 for each transaction in the red)
22
22 public class CheckbookWithRedInk extends CheckbookWithTotals { public CheckbookWithRedInk(int bd, int bc) { super(bd, bc); } public void deposit(int dd, int dc) { super.deposit(dd, dc); if (dd*100+dc < 0 && balance < 0) { System.out.println("$10 surcharge"); balance = balance - 1000; } public void withdraw(int wd, int wc) { super.withdraw(wd.wc); if (wd*100+wc > 0 && balance < 0) { System.out.println("$10 surcharge"); balance = balance - 1000; } public String toString() { String str; if (balance > 0) { str = super.toString(); } else { balance = -balance; str = "(" + super.toString() + ")"; balance = -balance; } return str; } BasicCheckbook # int balance «constructor» + BasicCheckbook( int, int) «update» + deposit( int, int) + withdraw( int, int) «query» + int balanceInCents() CheckbookWithStrBalance «constructor» + CheckbookWith...( int, int) «query» + String toString() CheckbookWithTotals # int depositTot # int withdrawTot «constructor» + CheckbookWithTotals( int, int) «update» + deposit( int, int) + withdraw( int, int) «query» + int deposits() + int withdraws()
23
23 public class Director { private CheckbookWithRedInk checkbook; public Director() { checkbook = new CheckbookWithRedInk( 100, 0 ); checkbook.deposit( 20, 0 ); checkbook.withdraw( 125, 99 ); System.out.println("Final Balance: " + checkbook.toString()); } CheckbookWithRedInk # int balance # int depositTot # int withdrawTot «constructor» + CheckbookWithRedInk( int, int) «update» + deposit( int, int) + withdraw( int, int) «query» + int balanceInCents() + String toString() + int deposits() + int withdraws() A flattened version of the class A client
24
24 Container This class is meant to be extended to create customized components Probably want to override setSize for example Probably don’t need to override getX, getY, setLocation, getWidth, getHeight Example: write a TrafficLight class! Lights are centered horizontally and distributed vertically Lights are 3/4 of the width of the light and ¼ of the light height
25
Object All classes descend from Object Two methods that should often be overridden Object +boolean equals(Object other) +String toString() …others not shown boolean equals(Object other) : returns true if the calling object is equal to the other one and false otherwise String toString() : returns the textual representation of the calling object
26
Fraction Class Write a Fraction class Represents a fraction (i.e. numerator / denominator) Support addition and multiplication Support equality checking and conversion to text Fraction +Fraction() +Fraction(int n,int d) +String toString() +boolean equals(Object other) +Fraction add(Fraction other) +Fraction multiply(Fraction other) // Code fragment showing usage Fraction f1 = new Fraction(3,5); Fraction f2 = new Fraction(6,3); Fraction f3 = f1.add(f2); Fraction f4 = f1.multiply(f2); System.out.println(f4.toString()); System.out.println(f4.equals(f3)); // Code fragment showing usage Fraction f1 = new Fraction(3,5); Fraction f2 = new Fraction(6,3); Fraction f3 = f1.add(f2); Fraction f4 = f1.multiply(f2); System.out.println(f4.toString()); System.out.println(f4.equals(f3));
27
Fraction class public class Fraction { private int num, denom; public Fraction(int n, int d) { … } public Fraction() { … } public Fraction multiply(Fraction other) { … } public Fraction add(Fraction other) { … } public String toString() { …} public boolean equals(Object other) { … } } public class Fraction { private int num, denom; public Fraction(int n, int d) { … } public Fraction() { … } public Fraction multiply(Fraction other) { … } public Fraction add(Fraction other) { … } public String toString() { …} public boolean equals(Object other) { … } } What does a Fraction object look like textually? When are two Fraction objects the same?
28
Equality Equality can be defined in two ways Identity equality: two objects are equal iff they are the same object Content equality: two objects are equal if they have the same content Both definitions are supported in Java ==: this operator always means identity equality. Can be applied to objects. equals method: this method usually means content equality but is defined as identity equality by default. Fraction f1 = new Fraction(3,5); Fraction f2 = new Fraction(3,5); Fraction f3 = new Fraction(5,3); boolean b1 = f1 == f2; boolean b2 = f1 == f3; boolean b3 = f1.equals(f2); boolean b4 = f1.equals(f3); Fraction f1 = new Fraction(3,5); Fraction f2 = new Fraction(3,5); Fraction f3 = new Fraction(5,3); boolean b1 = f1 == f2; boolean b2 = f1 == f3; boolean b3 = f1.equals(f2); boolean b4 = f1.equals(f3);
29
Summary Most classes should override toString and equals The equals method allows a class to define what equality means The toString method allows a class to define it’s textual look.
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.