0% found this document useful (0 votes)
62 views

Inheritance: Rights Reserved

java presentation

Uploaded by

Al Oy
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
62 views

Inheritance: Rights Reserved

java presentation

Uploaded by

Al Oy
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 63

Chapter 7

Inheritance

Copyright © 2016 Pearson Inc. All


rights reserved.
Introduction to Inheritance
• Inheritance is one of the main techniques of object-
oriented programming (OOP)
• Using this technique, a very general form of a class is
first defined and compiled, and then more
specialized versions of the class are defined by
adding instance variables and methods
– The specialized classes are said to inherit the methods and
instance variables of the general class

Copyright © 2016 Pearson Inc. All rights reserved. 7-2


Introduction to Inheritance
• Inheritance is the process by which a new class is created
from another class
– The new class is called a derived class
– The original class is called the base class
• A derived class automatically has all the instance variables
and methods that the base class has, and it can have
additional methods and/or instance variables as well
• Inheritance is especially advantageous because it allows code
to be reused, without having to copy it into the definitions of
the derived classes

Copyright © 2016 Pearson Inc. All rights reserved. 7-3


Derived Classes
• When designing certain classes, there is often a
natural hierarchy for grouping them
– In a record-keeping program for the employees of a
company, there are hourly employees and salaried
employees
– Hourly employees can be divided into full time and part
time workers
– Salaried employees can be divided into those on technical
staff, and those on the executive staff

Copyright © 2016 Pearson Inc. All rights reserved. 7-4


Derived Classes
• All employees share certain characteristics in
common
– All employees have a name and a hire date
– The methods for setting and changing names and
hire dates would be the same for all employees
• Some employees have specialized characteristics
– Hourly employees are paid an hourly wage, while
salaried employees are paid a fixed wage
– The methods for calculating wages for these two
different groups would be different

Copyright © 2016 Pearson Inc. All rights reserved. 7-5


Derived Classes
• Within Java, a class called Employee can be
defined that includes all employees
• This class can then be used to define classes for
hourly employees and salaried employees
– In turn, the HourlyEmployee class can be used to
define a PartTimeHourlyEmployee class, and
so forth

Copyright © 2016 Pearson Inc. All rights reserved. 7-6


A Class Hierarchy

Copyright © 2016 Pearson Inc. All rights reserved. 7-7


Derived Classes
• Since an hourly employee is an employee, it is
defined as a derived class of the class Employee
– A derived class is defined by adding instance variables and
methods to an existing class
– The existing class that the derived class is built upon is
called the base class
– The phrase extends BaseClass must be added to the
derived class definition:
public class HourlyEmployee extends Employee

Copyright © 2016 Pearson Inc. All rights reserved. 7-8


Derived Classes
• When a derived class is defined, it is said to inherit
the instance variables and methods of the base class
that it extends
– Class Employee defines the instance variables name and
hireDate in its class definition
– Class HourlyEmployee also has these instance
variables, but they are not specified in its class definition
– Class HourlyEmployee has additional instance
variables wageRate and hours that are specified in its
class definition

Copyright © 2016 Pearson Inc. All rights reserved. 7-9


Derived Classes
• Just as it inherits the instance variables of the class
Employee, the class HourlyEmployee inherits
all of its methods as well
– The class HourlyEmployee inherits the methods
getName, getHireDate, setName, and
setHireDate from the class Employee
– Any object of the class HourlyEmployee can invoke
one of these methods, just like any other method

Copyright © 2016 Pearson Inc. All rights reserved. 7-10


Derived Class (Subclass)
• A derived class, also called a subclass, is defined by
starting with another already defined class, called a
base class or superclass, and adding (and/or
changing) methods, instance variables, and static
variables
– The derived class inherits all the public methods, all the
public and private instance variables, and all the public and
private static variables from the base class
– The derived class can add more instance variables, static
variables, and/or methods

Copyright © 2016 Pearson Inc. All rights reserved. 7-11


Inherited Members
• A derived class automatically has all the instance
variables, all the static variables, and all the public
methods of the base class
– Members from the base class are said to be inherited
• Definitions for the inherited variables and methods
do not appear in the derived class
– The code is reused without having to explicitly copy it,
unless the creator of the derived class redefines one or
more of the base class methods

Copyright © 2016 Pearson Inc. All rights reserved. 7-12


Parent and Child Classes
• A base class is often called the parent class
– A derived class is then called a child class
• These relationships are often extended such that a
class that is a parent of a parent . . . of another class
is called an ancestor class
– If class A is an ancestor of class B, then class B can be
called a descendent of class A

Copyright © 2016 Pearson Inc. All rights reserved. 7-13


Overriding a Method Definition
• Although a derived class inherits methods
from the base class, it can change or override
an inherited method if necessary
– In order to override a method definition, a new
definition of the method is simply placed in the
class definition, just like any other method that is
added to the derived class

Copyright © 2016 Pearson Inc. All rights reserved. 7-14


Changing the Return Type of an Overridden
Method
• Ordinarily, the type returned may not be changed
when overriding a method
• However, if it is a class type, then the returned type
may be changed to that of any descendent class of
the returned type
• This is known as a covariant return type
– Covariant return types are new in Java 5.0; they are not
allowed in earlier versions of Java

Copyright © 2016 Pearson Inc. All rights reserved. 7-15


Covariant Return Type
• Given the following base class:
public class BaseClass
{ . . .
public Employee getSomeone(int someKey)
. . .
• The following is allowed in Java 5.0:
public class DerivedClass extends BaseClass
{ . . .
public HourlyEmployee getSomeone(int someKey)
. . .

Copyright © 2016 Pearson Inc. All rights reserved. 7-16


Changing the Access Permission of an
Overridden Method
• The access permission of an overridden method can
be changed from private in the base class to public
(or some other more permissive access) in the
derived class
• However, the access permission of an overridden
method can not be changed from public in the base
class to a more restricted access permission in the
derived class

Copyright © 2016 Pearson Inc. All rights reserved. 7-17


Changing the Access Permission of an
Overridden Method
• Given the following method header in a base case:
private void doSomething()
• The following method header is valid in a derived class:
public void doSomething()
• However, the opposite is not valid
• Given the following method header in a base case:
public void doSomething()
• The following method header is not valid in a derived class:
private void doSomething()

Copyright © 2016 Pearson Inc. All rights reserved. 7-18


Pitfall: Overriding Versus Overloading

• Do not confuse overriding a method in a derived


class with overloading a method name
– When a method is overridden, the new method
definition given in the derived class has the exact
same number and types of parameters as in the base
class
– When a method in a derived class has a different
signature from the method in the base class, that is
overloading
– Note that when the derived class overloads the
original method, it still inherits the original method
from the base class as well

Copyright © 2016 Pearson Inc. All rights reserved. 7-19


The final Modifier
• If the modifier final is placed before the
definition of a method, then that method may
not be redefined in a derived class
• It the modifier final is placed before the
definition of a class, then that class may not
be used as a base class to derive other classes

Copyright © 2016 Pearson Inc. All rights reserved. 7-20


The super Constructor
• A derived class uses a constructor from the base class to
initialize all the data inherited from the base class
– In order to invoke a constructor from the base class, it uses a special
syntax:
public derivedClass(int p1, int p2, double p3)
{
super(p1, p2);
instanceVariable = p3;
}
– In the above example, super(p1, p2); is a call to the base class
constructor

Copyright © 2016 Pearson Inc. All rights reserved. 7-21


The super Constructor
• A call to the base class constructor can never use the
name of the base class, but uses the keyword super
instead
• A call to super must always be the first action taken
in a constructor definition
• An instance variable cannot be used as an argument
to super

Copyright © 2016 Pearson Inc. All rights reserved. 7-22


The super Constructor
• If a derived class constructor does not include an
invocation of super, then the no-argument
constructor of the base class will automatically be
invoked
– This can result in an error if the base class has not defined
a no-argument constructor
• Since the inherited instance variables should be
initialized, and the base class constructor is designed
to do that, then an explicit call to super should
always be used

Copyright © 2016 Pearson Inc. All rights reserved. 7-23


The this Constructor
• Within the definition of a constructor for a class,
this can be used as a name for invoking another
constructor in the same class
– The same restrictions on how to use a call to super apply
to the this constructor
• If it is necessary to include a call to both super and
this, the call using this must be made first, and
then the constructor that is called must call super
as its first action

Copyright © 2016 Pearson Inc. All rights reserved. 7-24


The this Constructor
• Often, a no-argument constructor uses this to invoke an
explicit-value constructor
– No-argument constructor (invokes explicit-value constructor using
this and default arguments):
public ClassName()
{
this(argument1, argument2);
}
– Explicit-value constructor (receives default values):
public ClassName(type1 param1, type2 param2)
{
. . .
}

Copyright © 2016 Pearson Inc. All rights reserved. 7-25


The this Constructor
public HourlyEmployee()
{
this("No name", new Date(), 0, 0);
}
• The above constructor will cause the constructor
with the following heading to be invoked:
public HourlyEmployee(String theName,
Date theDate, double theWageRate, double
theHours)

Copyright © 2016 Pearson Inc. All rights reserved. 7-26


Tip: An Object of a Derived Class Has More than
One Type
• An object of a derived class has the type of the
derived class, and it also has the type of the base
class
• More generally, an object of a derived class has the
type of every one of its ancestor classes
– Therefore, an object of a derived class can be assigned to a
variable of any ancestor type

Copyright © 2016 Pearson Inc. All rights reserved. 7-27


Tip: An Object of a Derived Class Has More than
One Type
• An object of a derived class can be plugged in as a
parameter in place of any of its ancestor classes
• In fact, a derived class object can be used anyplace
that an object of any of its ancestor types can be
used
• Note, however, that this relationship does not go the
other way
– An ancestor type can never be used in place of one of its
derived types

Copyright © 2016 Pearson Inc. All rights reserved. 7-28


Pitfall: The Terms "Subclass" and "Superclass"

• The terms subclass and superclass are sometimes


mistakenly reversed
– A superclass or base class is more general and inclusive,
but less complex
– A subclass or derived class is more specialized, less
inclusive, and more complex
• As more instance variables and methods are added, the number of
objects that can satisfy the class definition becomes more
restricted

Copyright © 2016 Pearson Inc. All rights reserved. 7-29


An Enhanced StringTokenizer Class

• Thanks to inheritance, most of the standard Java


library classes can be enhanced by defining a derived
class with additional methods
• For example, the StringTokenizer class enables
all the tokens in a string to be generated one time
– However, sometimes it would be nice to be able to cycle
through the tokens a second or third time

Copyright © 2016 Pearson Inc. All rights reserved. 7-30


An Enhanced StringTokenizer Class

• This can be made possible by creating a derived class:


– For example, EnhancedStringTokenizer can inherit the useful
behavior of StringTokenizer
– It inherits the countTokens method unchanged
• The new behavior can be modeled by adding new methods,
and/or overriding existing methods
– A new method, tokensSoFar, is added
– While an existing method, nextToken, is overriden

Copyright © 2016 Pearson Inc. All rights reserved. 7-31


An Enhanced StringTokenizer Class
(Part 1 of 4)

Copyright © 2016 Pearson Inc. All rights reserved. 7-32


An Enhanced StringTokenizer Class
(Part 2 of 4)

Copyright © 2016 Pearson Inc. All rights reserved. 7-33


An Enhanced StringTokenizer Class
(Part 3 of 4)

Copyright © 2016 Pearson Inc. All rights reserved. 7-34


An Enhanced StringTokenizer Class
(Part 4 of 4)

Copyright © 2016 Pearson Inc. All rights reserved. 7-35


Encapsulation and Inheritance Pitfall: Use of Private
Instance Variables from the Base Class

• An instance variable that is private in a base class is not


accessible by name in the definition of a method in any
other class, not even in a method definition of a derived
class
– For example, an object of the HourlyEmployee class cannot
access the private instance variable hireDate by name, even
though it is inherited from the Employee base class
• Instead, a private instance variable of the base class can
only be accessed by the public accessor and mutator
methods defined in that class
– An object of the HourlyEmployee class can use the
getHireDate or setHireDate methods to access
hireDate

Copyright © 2016 Pearson Inc. All rights reserved. 7-36


Encapsulation and Inheritance Pitfall: Use of Private
Instance Variables from the Base Class

• If private instance variables of a class were


accessible in method definitions of a derived
class, then anytime someone wanted to access a
private instance variable, they would only need
to create a derived class, and access it in a
method of that class
– This would allow private instance variables to be
changed by mistake or in inappropriate ways (for
example, by not using the base type's accessor and
mutator methods only)

Copyright © 2016 Pearson Inc. All rights reserved. 7-37


Pitfall: Private Methods Are Effectively Not
Inherited
• The private methods of the base class are like private
variables in terms of not being directly available
• However, a private method is completely unavailable, unless
invoked indirectly
– This is possible only if an object of a derived class invokes a public
method of the base class that happens to invoke the private method
• This should not be a problem because private methods should
just be used as helping methods
– If a method is not just a helping method, then it should be public, not
private

Copyright © 2016 Pearson Inc. All rights reserved. 7-38


Protected and Package
Access
• If a method or instance variable is modified by protected
(rather than public or private), then it can be accessed
by name
– Inside its own class definition
– Inside any class derived from it
– In the definition of any class in the same package
• The protected modifier provides very weak protection
compared to the private modifier
– It allows direct access to any programmer who defines a suitable
derived class
– Therefore, instance variables should normally not be marked
protected

Copyright © 2016 Pearson Inc. All rights reserved. 7-39


Protected and Package
Access
• An instance variable or method definition that is not
preceded with a modifier has package access
– Package access is also known as default or friendly access
• Instance variables or methods having package access
can be accessed by name inside the definition of any
class in the same package
– However, neither can be accessed outside the package

Copyright © 2016 Pearson Inc. All rights reserved. 7-40


Protected and Package
Access
• Note that package access is more restricted
than protected
– Package access gives more control to the
programmer defining the classes
– Whoever controls the package directory (or
folder) controls the package access

Copyright © 2016 Pearson Inc. All rights reserved. 7-41


Access Modifiers

Copyright © 2016 Pearson Inc. All rights reserved. 7-42


Pitfall: Forgetting About the Default Package

• When considering package access, do not forget


the default package
– All classes in the current directory (not belonging to
some other package) belong to an unnamed package
called the default package
• If a class in the current directory is not in any
other package, then it is in the default package
– If an instance variable or method has package access,
it can be accessed by name in the definition of any
other class in the default package

Copyright © 2016 Pearson Inc. All rights reserved. 7-43


Pitfall: A Restriction on Protected Access

• If a class B is derived from class A, and class A has a


protected instance variable n, but the classes A and
B are in different packages, then the following is
true:
– A method in class B can access n by name (n is inherited
from class A)
– A method in class B can create a local object of itself,
which can access n by name (again, n is inherited from
class A)

Copyright © 2016 Pearson Inc. All rights reserved. 7-44


Pitfall: A Restriction on Protected Access

• However, if a method in class B creates an object of class A, it


can not access n by name
– A class knows about its own inherited variables and methods
– However, it cannot directly access any instance variable or method of
an ancestor class unless they are public
– Therefore, B can access n whenever it is used as an instance variable
of B, but B cannot access n when it is used as an instance variable of A
• This is true if A and B are not in the same package
– If they were in the same package there would be no problem, because
protected access implies package access

Copyright © 2016 Pearson Inc. All rights reserved. 7-45


Tip: "Is a" Versus "Has a"
• A derived class demonstrates an "is a" relationship
between it and its base class
– Forming an "is a" relationship is one way to make a more
complex class out of a simpler class
– For example, an HourlyEmployee "is an" Employee
– HourlyEmployee is a more complex class compared to
the more general Employee class

Copyright © 2016 Pearson Inc. All rights reserved. 7-46


Tip: "Is a" Versus "Has a"
• Another way to make a more complex class out of a
simpler class is through a "has a" relationship
– This type of relationship, called composition, occurs when
a class contains an instance variable of a class type
– The Employee class contains an instance variable,
hireDate, of the class Date, so therefore, an
Employee "has a" Date

Copyright © 2016 Pearson Inc. All rights reserved. 7-47


Tip: "Is a" Versus "Has a"
• Both kinds of relationships are commonly
used to create complex classes, often within
the same class
– Since HourlyEmployee is a derived class of
Employee, and contains an instance variable of
class Date, then HourlyEmployee "is an"
Employee and "has a" Date

Copyright © 2016 Pearson Inc. All rights reserved. 7-48


Tip: Static Variables Are Inherited
• Static variables in a base class are inherited by
any of its derived classes
• The modifiers public, private, and
protected, and package access have the
same meaning for static variables as they do
for instance variables

Copyright © 2016 Pearson Inc. All rights reserved. 7-49


Access to a Redefined Base Method

• Within the definition of a method of a derived class, the base


class version of an overridden method of the base class can
still be invoked
– Simply preface the method name with super and a dot
public String toString()
{
return (super.toString() + "$" + wageRate);
}
• However, using an object of the derived class outside of its
class definition, there is no way to invoke the base class
version of an overridden method

Copyright © 2016 Pearson Inc. All rights reserved. 7-50


You Cannot Use Multiple supers
• It is only valid to use super to invoke a method from a direct
parent
– Repeating super will not invoke a method from some other ancestor
class
• For example, if the Employee class were derived from the
class Person, and the HourlyEmployee class were
derived form the class Employee , it would not be possible
to invoke the toString method of the Person class within
a method of the HourlyEmployee class
super.super.toString() // ILLEGAL!

Copyright © 2016 Pearson Inc. All rights reserved. 7-51


The Class Object
• In Java, every class is a descendent of the class
Object
– Every class has Object as its ancestor
– Every object of every class is of type Object, as well as
being of the type of its own class
• If a class is defined that is not explicitly a derived
class of another class, it is still automatically a
derived class of the class Object

Copyright © 2016 Pearson Inc. All rights reserved. 7-52


The Class Object
• The class Object is in the package java.lang
which is always imported automatically
• Having an Object class enables methods to be
written with a parameter of type Object
– A parameter of type Object can be replaced by an object
of any class whatsoever
– For example, some library methods accept an argument of
type Object so they can be used with an argument that
is an object of any class

Copyright © 2016 Pearson Inc. All rights reserved. 7-53


The Class Object
• The class Object has some methods that every Java class
inherits
– For example, the equals and toString methods
• Every object inherits these methods from some ancestor class
– Either the class Object itself, or a class that itself inherited these
methods (ultimately) from the class Object
• However, these inherited methods should be overridden with
definitions more appropriate to a given class
– Some Java library classes assume that every class has its own version
of such methods

Copyright © 2016 Pearson Inc. All rights reserved. 7-54


The Right Way to Define equals
• Since the equals method is always inherited from
the class Object, methods like the following simply
overload it:
public boolean equals(Employee otherEmployee)
{ . . . }
• However, this method should be overridden, not just
overloaded:
public boolean equals(Object otherObject)
{ . . . }

Copyright © 2016 Pearson Inc. All rights reserved. 7-55


The Right Way to Define equals
• The overridden version of equals must meet the
following conditions
– The parameter otherObject of type Object must be
type cast to the given class (e.g., Employee)
– However, the new method should only do this if
otherObject really is an object of that class, and if
otherObject is not equal to null
– Finally, it should compare each of the instance variables of
both objects

Copyright © 2016 Pearson Inc. All rights reserved. 7-56


A Better equals Method for the Class
Employee
public boolean equals(Object otherObject)
{
if(otherObject == null)
return false;
else if(getClass( ) != otherObject.getClass( ))
return false;
else
{
Employee otherEmployee = (Employee)otherObject;
return (name.equals(otherEmployee.name) &&
hireDate.equals(otherEmployee.hireDate));
}
}

Copyright © 2016 Pearson Inc. All rights reserved. 7-57


Tip: getClass Versus instanceof

• Many authors suggest using the instanceof operator in


the definition of equals
– Instead of the getClass() method
• The instanceof operator will return true if the object
being tested is a member of the class for which it is being
tested
– However, it will return true if it is a descendent of that class as well
• It is possible (and especially disturbing), for the equals
method to behave inconsistently given this scenario

Copyright © 2016 Pearson Inc. All rights reserved. 7-58


Tip: getClass Versus instanceof

• Here is an example using the class Employee


. . . //excerpt from bad equals method
else if(!(OtherObject instanceof Employee))
return false; . . .
• Now consider the following:
Employee e = new Employee("Joe", new Date());
HourlyEmployee h = new
HourlyEmployee("Joe", new Date(),8.5, 40);
boolean testH = e.equals(h);
boolean testE = h.equals(e);

Copyright © 2016 Pearson Inc. All rights reserved. 7-59


Tip: getClass Versus instanceof

• testH will be true, because h is an Employee


with the same name and hire date as e
• However, testE will be false, because e is not an
HourlyEmployee, and cannot be compared to h
• Note that this problem would not occur if the
getClass() method were used instead, as in the
previous equals method example

Copyright © 2016 Pearson Inc. All rights reserved. 7-60


instanceof and getClass
• Both the instanceof operator and the
getClass() method can be used to check the
class of an object
• However, the getClass() method is more exact
– The instanceof operator simply tests the class of an
object
– The getClass() method used in a test with == or !=
tests if two objects were created with the same class

Copyright © 2016 Pearson Inc. All rights reserved. 7-61


The instanceof Operator
• The instanceof operator checks if an
object is of the type given as its second
argument
Object instanceof ClassName
– This will return true if Object is of type
ClassName, and otherwise return false
– Note that this means it will return true if
Object is the type of any descendent class of
ClassName

Copyright © 2016 Pearson Inc. All rights reserved. 7-62


The getClass() Method
• Every object inherits the same getClass()
method from the Object class
– This method is marked final, so it cannot be overridden
• An invocation of getClass() on an object returns
a representation only of the class that was used with
new to create the object
– The results of any two such invocations can be compared
with == or != to determine whether or not they represent
the exact same class
(object1.getClass() == object2.getClass())

Copyright © 2016 Pearson Inc. All rights reserved. 7-63

You might also like