Transcript

Extending classes with inheritance

Learning objectives

By the end of this lecture you should be able to:

• explain the term inheritance;

• design inheritance structures using UML notation;

• implement inheritance relationships in Java;

• distinguish between method overriding and method overloading;

• explain the term type cast and implement this in Java;

• explain the use of the abstract modifier and the final modifier, when applied to both classes and methods;

• describe the way in which all Java classes are derived from the Object class.

Software Reuse

Employee

Full-time Employee

Part-time Employee

BankAccount

Interest Account

Defining inheritance

Inheritance is the sharing of attributes and methods among classes;

The inheritance relationship is also often referred to as an is-a-kind-of relationship;

PartTimeEmployee is a kind of Employee

InterestAccount is a kind of BankAccount

Car is a kind of Vehicle

Monitor is not a kind of Computer

UML notation for inheritance

Employee

number : String name : String

Employee(String, String) setName(String) getNumber() : String getName() : String

PartTimeEmployee

hourlyPay : double

PartTimeEmployee(String, String, double) setHourlyPay(double) getHourlyPay() :double calculateWeeklyPay(int) :double

superclass

subclass

base class

derived class

public class Employee{ private String number; private String name;

public Employee(String numberIn, String nameIn) { number = numberIn; name = nameIn; } public void setName(String nameIn) { name = nameIn; } public String getNumber() { return number; } public String getName() { return name; }}

public class PartTimeEmployee extends Employee { private double hourlyPay; public PartTimeEmployee(String numberIn, String nameIn, double hourlyPayIn) { super(numberIn, nameIn); hourlyPay = hourlyPayIn; } public double getHourlyPay() { return hourlyPay; } public void setHourlyPay(double hourlyPayIn) { hourlyPay = hourlyPayIn; } public double calculateWeeklyPay(int noOfHoursIn) { return noOfHoursIn * hourlyPay; }}

public class PartTimeEmployeeTester{

public static void main(String[] args) {

String number, name; double pay; int hours; PartTimeEmployee emp; System.out.print("Employee Number? "); number = EasyScanner.nextString(); System.out.print("Employee's Name? "); name = EasyScanner.nextString(); System.out.print("Hourly Pay? "); pay = EasyScanner.nextDouble(); System.out.print("Hours worked this week? "); hours = EasyScanner.nextInt();

emp = new PartTimeEmployee(number, name, pay); System.out.println();

System.out.println(emp.getName()); System.out.println(emp.getNumber()); System.out.println(emp.calculateWeeklyPay(hours));

}}

public class PartTimeEmployeeTester{

public static void main(String[] args) {

String number, name; double pay; int hours; PartTimeEmployee emp; System.out.print("Employee Number? "); number = EasyScanner.nextString(); System.out.print("Employee's Name? "); name = EasyScanner.nextString(); System.out.print("Hourly Pay? "); pay = EasyScanner.nextDouble(); System.out.print("Hours worked this week? "); hours = EasyScanner.nextInt();

emp = new PartTimeEmployee(number, name, pay); System.out.println();

System.out.println(emp.getName()); System.out.println(emp.getNumber()); System.out.println(emp.calculateWeeklyPay(hours));

}}

RUN

Employee Number?

Walter WallcarpetingA103456310.0

Employee's Name?

Hourly Pay?

Hours worked this week?

A103456

Walter Wallcarpeting

15.50

20

Extending the Oblong class

6.5

9.2

Oblong myOblong = new Oblong(6.5, 9.2);

******************************************************

ExtendedOblong

symbol : char

ExtendedOblong(double, double, char) setSymbol(char) draw() : String

Oblong

length : doubleheight : double

Oblong(double, double)setLength(double)setHeight(double)getLength() : doublegetHeight() : doublecalculateArea() : doublecalculatePerimeter() : double

public class ExtendedOblong extends Oblong{ private char symbol;

public ExtendedOblong (double lengthIn, double heightIn, char symbolIn) { super(lengthIn, heightIn); symbol = symbolIn; }

public void setSymbol(char symbolIn) { symbol = symbolIn; }

public String draw() {

// code to produce String goes here }}

The new-line character

************

**** **** ****<NEW LINE> <NEW LINE>‘\n’ ‘\n’

for (int j = 1; j <= length; j++){ s = s + symbol; }s = s + '\n';

for (int i = 1; i <= height; i++){ }

<NEW LINE>‘\n’

public String draw(){ String s ; int length, height; length = getLength(); height = getHeight(); for (int i = 1; i <= height; i++) { for (int j = 1; j <= length; j++) { s = s + symbol; } s = s + '\n'; } return s; }}

= “ “;= new String();

(int)(int)

public class ExtendedOblongTester

{

public static void main(String[] args)

{

ExtendedOblong extOblong = new ExtendedOblong(10,5,'*');

System.out.println(extOblong.draw());

extOblong.setSymbol('+');

System.out.println(extOblong.draw());

}

}

RUN

**************************************************

++++++++++++++++++++++++++++++++++++++++++++++++++

Method overriding

Customer

name : StringtotalMoneyPaid : doubletotalGoodsReceived : double

Customer(String)getName() : StringgetTotalMoneyPaid() : doublegetTotalGoodsReceived() : doublecalculateBalance() : doublerecordPayment(double)dispatchGoods(double) : boolean

GoldCustomer

creditLimit : double

GoldCustomer(String, double)getCreditLimit() : doublesetCreditLimit(double)dispatchGoods(double) : boolean

public class Customer

{

protected String name;

protected double totalMoneyPaid;

protected double totalGoodsReceived;

public Customer(String nameIn)

{

name = nameIn;

totalMoneyPaid = 0;

totalGoodsReceived = 0;

}

// more methods go here

}

public String getName(){ return name;} public double getTotalMoneyPaid(){ return totalMoneyPaid;} public double getTotalGoodsReceived(){ return totalGoodsReceived;} public double calculateBalance(){ return totalMoneyPaid - totalGoodsReceived;}

public void recordPayment(double paymentIn)

{

totalMoneyPaid = totalMoneyPaid + paymentIn;

}

public boolean dispatchGoods(double goodsIn)

{

if(calculateBalance() >= goodsIn)

{

totalGoodsReceived = totalGoodsReceived + goodsIn;

return true;

}

else

{

return false;

}

}

public class GoldCustomer extends Customer{ private double creditLimit; public GoldCustomer(String nameIn, double limitIn) { super(nameIn); creditLimit = limitIn; } public void setCreditLimit(double limitIn) { creditLimit = limitIn; } public double getCreditLimit() { return creditLimit; } // code for dispatchGoods}

public boolean dispatchGoods(double goodsIn)

{

if((calculateBalance() + creditLimit) >= goodsIn)

{

totalGoodsReceived = totalGoodsReceived + goodsIn;

return true;

}

else

{

return false;

}

}

Customer firstCustomer = new Customer("Jones");

GoldCustomer secondCustomer = new GoldCustomer("Cohen", 500);

// more code here

firstCustomer.dispatchGoods(98.76);

secondCustomer.dispatchGoods(32.44);

Effect of overriding methods

Abstract classes and methods

draw()

abstract draw()

draw()

Shape

Circle Triangle

abstract Shape

Employee

number : String name : String

Employee(String, String) setName(String) getNumber() : String getName() : String getStatus() : String

FullTimeEmployee

annualSalary : double

FullTimeEmployee(String, String, double) setAnnualSalary(double) getAnnualSalary() : double calculateMonthlyPay () : double getStatus() : String

PartTimeEmployee

hourlyPay : double

PartTimeEmployee(String,String, double) setHourlyPay(double) getHourlyPay() : double calculateWeeklyPay(int) : double getStatus() : String

An Example

public abstract class Employee{ // attributes as before // methods as before abstract public String getStatus(); }

public class PartTimeEmployee extends Employee{ // code as before public String getStatus() { return "Part-Time"; }}

public class FullTimeEmployee extends Employee

{

private double annualSalary;

public FullTimeEmployee(String numberIn, String nameIn, double salaryIn)

{

super(numberIn,nameIn);

annualSalary = salaryIn;

}

// other methods here

}

public void setAnnualSalary(double salaryIn){ annualSalary = salaryIn;}

public double getAnnualSalary(){ return annualSalary;}public double calculateMonthlyPay(){ return annualSalary/12;}

public String getStatus(){ return "Full-Time";}

Inheritance and Types Employee e ;

PartTimeEmployee p ; FullTimeEmployee f ;

getStatus()

abstract getStatus()

getStatus()

Employee

PartTimeEmployee FullTimeEmployee

public class StatusTester{ public static void tester(Employee employeeIn) { System.out.println(employeeIn.getStatus()); }}

public class RunStatusTester

{

public static void main(String[] args)

{

FullTimeEmployee fte = new FullTimeEmployee("100", "Patel", 30000);

PartTimeEmployee pte = new PartTimeEmployee("101", "Jones", 12);

StatusTester.tester(fte);

StatusTester.tester(pte);

}

}

RUN

Full-TimePart-Time

The final modifier

final double PI = 3.1417; public final class SomeClass{

// code goes here}

public final void someMethod(){ // code goes here}

SomeClass

someMethod()

AnotherClass

someMethod()

final SomeClass

final someMethod()

The Object class

Employee

PartTimeEmployee FullTimeEmployee

String BankAccount

Object

Generic Arrays

private BankAccount[] list; This array can only hold BankAccount objects

private Employee[] list; This array can only hold Employee objects

private Object[] list; This array can only hold any type of objects

Bank

EmployeeList

ObjectList

Generic Methods - add

public boolean add( BankAccount itemIn){ if (!isFull()) { list[total] = itemIn; total++; return true; } else { return false; }}

Object

objectList.add( new BankAccount(“007”, “James Bond”) ) ;

Generic Methods - getItem

public BankAccount getItem(int positionIn){ if(positionIn < 1 || positionIn > total) { return null; } else { return list[positionIn - 1]; }}

Object

BankAccount myAccount = objectList.getItem(3);

System.out.println(myAccount.getBalance());

(BankAccount) objectList.getItem(3);

Wrapper classes

Q How could you use an array of Objects to store a simple type such as an int or a char - or to pass such a type to a method that expects an Object?

A Use a wrapper class.

Integer

hidden int

Integer(int)

getValue():int

Character

hidden char

Character(char)

getValue():char

Double

hidden double

Double(double)

getValue():double

objectList.add( new Integer( 37)) ;

Autoboxing

Object[] anArray = new Object[20];

anArray[0] = new Integer(37);

Java 5.0 allows us to make use of a technique known as autoboxing:

anArray[0] = 37;

Unboxing

Integer intObject = (Integer) anArray[0];int x = intObject.getValue();

Java 5.0 allows us to make use of a technique known as unboxing:

int x = (Integer) anArray[0];

A mixed list

Third item

Second item

First item

Part-timeemployee

Full-timeemployee

Full-timeemployee

Employee[] employeeList = new Employee[3];

public class MixedListTester{ public static void main(String[] args) { Employee[] employeeList = new Employee[3]; String num, name; double pay; char status; for(int i = 0; i < employeeList.length; i++) { System.out.print("Enter the employee number: "); num = EasyScanner.nextString(); System.out.print("Enter the employee's name: "); name = EasyScanner.nextString(); System.out.print("<F>ull-time or <P>art-time? "); status = EasyScanner.nextChar(); // more code here}

if(status == 'f' || status == 'F') { System.out.print("Enter the annual salary: "); } else { System.out.print("Enter the hourly pay: "); } pay = EasyScanner.nextDouble(); if(status == 'f' || status == 'F') { employeeList[i] = new FullTimeEmployee(num, name, pay); } else { employeeList[i] = new PartTimeEmployee(num, name, pay); } System.out.println();} // end of loop

for(Employee item : employeeList)

{

System.out.println("Employee number: " + item.getNumber());

System.out.println("Employee name: " + item.getName());

System.out.println("Status: " + item.getStatus());

System.out.println();

}

public class MixedListTester{ public static void main(String[] args) { Employee[] employeeList = new Employee[3]; // declare local variables to hold values entered by user String num, name; double pay; char status; for(int i = 0; i < employeeList.length; i++) { System.out.print("Enter the employee number: "); num = EasyScanner.nextString(); System.out.print("Enter the employee's name: "); name = EasyScanner.nextString(); System.out.print("<F>ull-time or <P>art-time? "); status = EasyScanner.nextChar(); if(status == 'f' || status == 'F') { System.out.print("Enter the annual salary: "); } else { System.out.print("Enter the hourly pay: "); } pay = EasyScanner.nextDouble(); if(status == 'f' || status == 'F') { employeeList[i] = new FullTimeEmployee(num, name, pay); } else { employeeList[i] = new PartTimeEmployee(num, name, pay); } System.out.println(); } for(Employee item : employeeList) { System.out.println("Employee number: " + item.getNumber()); System.out.println("Employee name: " + item.getName()); System.out.println("Status: " + item.getStatus()); System.out.println(); } }}

RUN

Enter the employee number: 1

Enter the employee's name: Jones

<F>ull-time or <P>art-time? f

Enter the annual salary: 30000

Enter the employee number: 2

Enter the employee's name: Agdeboye

<F>ull-time or <P>art-time? f

Enter the annual salary: 35000

Enter the employee number: 3

Enter the employee's name: Sharma

<F>ull-time or <P>art-time? p

Enter the hourly pay: 15

RUN

Employee number: 1

Employee name: Jones

Status: Full-Time

Employee number: 2

Employee name: Agdeboye

Status: Full-Time

Employee number: 3

Employee name: Sharma

Status: Part-Time


Top Related