Title: Introduction To Scientific Programming
1Introduction To Scientific Programming
- Chapter 7 Inheritance or (More on Classes)
2Lecture Overview On Inheritance
- Inheritance Basics
- Class Hierarchy
- Derived Classes
- Overriding
- Programming With Inheritance
- Methods
- Variables
- Constructors
- Assignments
- Abstract Classes (skipping interfaces)
- Dynamic Binding Polymorphism
3I. Inheritance Basics
- Inheritance allows you to define a generic
class and then later define more specialized
classes that add new detail relative to the
generic class. - This generic class is called the base or parent
class. - Specialized classes are derived from the base
class and are called derived or child classes - The specialized classes inherit all the
properties of the base class. - After the general class is developed you only
have to write the difference or specialization
code for each derived class.
4Class Hierarchy
- With a base class and any derived class(es), a
structure or hierarchy is established. - Any class lower in the hierarchy is a descendent
class. Any class higher in the hierarchy is an
ancestor class. - This hierarchy can have as many levels as
required. That is, a class can be derived from
derived classes (child classes can be parent
classes!). - Note this class hierarchy exists for all classes
including all built-in Java classes/packages.
5What Does Inheritance Do For Me?
- Inheritance helps accomplish several of the main
goals of object oriented programming (OOP) - Reduce the complexity of programs by only
requiring specialized code for many tasks - Simplify the tasks of writing, testing, and
maintaining complex programs by breaking down the
problem into sub-parts - Promotes the reuse of classes developed for one
application to another application (instead of
writing new programs from scratch).
6Example Of A Class Hierarchy
- The base or generic class can be used to
implement specialized classes (e.g. student,
employee, faculty, ) - Classes can be derived from the classes derived
from the base class.
7"Is a" and "Has a" Relationships
- Inheritance is useful for "is a" relationships.
- A student "is a" person.
- Student inherits from Person.
- Inheritance is usually not useful for "has a"
relationships. - A student "has a(n)" enrollment date.
- Just add a Date instance variable to Student
instead of having Student inherit from a class
called Date.
8Example Of Inheritancea Person Base Class
- public class Person
-
- private String name
-
- //Default constructor
- public Person()
-
- name "No name yet."
-
- //Constructor to init Person name
- public Person(String initialName)
-
- name initialName
-
- //Mutator to set Person name
- public void setName(String newName)
-
//Method to output Person
name public void writeOutput()
System.out.println("Name "
name) //Method to check if
same name public boolean sameName(Person
otherPerson) return
(this.name.equalsIgnoreCase(
otherPerson.getName()))
9Notes On Person Base Class
- Constructors
- A default constructor
- One that initializes the name attribute (instance
variable) - Accessor methods
- setName to change the value of the name
attribute - getName to read the value of the name attribute
- writeOutput to display the value of the name
attribute - One other class method
- sameName to compare the values of the name
attributes for objects of the class.
10Notes On Person Base Class - II
- The name attribute is private
- This encapsulates the data.
- It keeps the data local to the base class and
prevents descendant classes from corrupting it. - Data values are still accessible through methods.
- The methods in Person are public
- This is necessary so that child classes can
access (take advantage of) base class methods and
data.
11Derived Classes
- To create a derived class, use the extends
reserved word - The keyword extends in first line indicates
inheritance. - E.g. - derived class Student from base class
Person - A derived class has the instance variables and
methods of the base class that it extends. - The Person class has a name instance variable so
the Student class will also have a name instance
variable. - Can call the setName method with a Student object
even though setName is defined in Person and not
in Student
public class Student extends Person
Student s new Student() s.setName(Jeff
Davis")
12Extending A Class
- A derived class can add instance variables and/or
methods to those it inherits from its base class. - Think of a derived class as having access to
itself and all of its ancestors. - Example consider the derived class Student from
base class Person (Display 7.3 on p. 419 of
Savitch - Third Edition) - An instance variable has been added to Student
- Student has studentNumber in addition to name,
which it inherited from Person - Student also has several additional methods
- reset, getStudentNumber, setStudentNumber,
writeOutput, equals, and some constructors
13Example Of A Class Hierarchy - Revisited
- Each descendant (derived) class has potential
access to all ancestor classes. - A superclass is all ancestor classes for a
derived class.
14Overriding Methods
- When a child class has a method with the same
signature as the parent class, the method in the
child class overrides the one in the parent
class! - This is overriding, not overloading.
- Example
- Both Person and Student have a writeOutput method
with no parameters (same signature). - When writeOutput is called with a Student object,
the writeOutput in Student will be used, not the
one in Person.
15Overriding vs. Overloading
- Overloading
- Same method name
- Different signatures
- Both methods can be in same class
- Overriding
- Same method name
- Same signature
- One method in ancestor, one in descendant of
ancestor
16The final Modifier
- This specifies that a method definition cannot be
overridden with a new definition in a derived
class - Example
- public final void specialMethod()
-
- Used in specification of some methods and
constants in standard libraries - Constants such as pi, e in Math class
- Certain system and user interface methods (forms,
dialogs,) - You can also declare an entire class to be final,
which means it cannot be used as a base class to
derive another class.
17II. Programming With Inheritance - Methods
- Recall, access to any public method for any
derived class object (or any of its ancestors),
is available by invoking the method name - You can call the setName method with a Student
object even though setName is defined in Person
and not in Student - This is possible because setName is a public
method. - private methods are not available outside of the
class nor by any descendant class (only in the
class in which it is defined). This means
private methods are not inherited.
Student s new Student() s.setName(Jeff
Davis")
18What About Overridden Methods?
- Internally, you can still access overridden
methods in descendant classes! - In fact, many times it is preferred.
- External to the class, an overridden method means
that only the descendant method is invoked when
the descendant object is used. - But internally, this descendant method can invoke
the method it overrode in the ancestor class!
19Overridden Methods - II
- Use super to call a method in the parent class
that was overridden (redefined) in the derived
class - Example Student redefined the method writeOutput
of its parent class, Person - Can use super.writeOutput() to invoke the
overridden (parent) method
public void writeOutput() super.writeOutput()
System.out.println("Student Number
studentNumber)
20Instance Variables
- public instance variables from ancestor classes
are available by name in derived classes. - private instance variables from ancestor classes
are not available by name in derived classes - One should use accessor methods to change them.
E.g. a reset method for a Student object to
change the name attribute - Can you have a public instance variable with the
same name in derived classes?
21A Constructor In A Derived Class
- A constructor initializes a class object, so in
any derived class, how do you initialize all of
the ancestors which the class might reference? - You need to invoke the ancestors constructors
(i.e. constructors that can call other
constructors) - This is accomplished by using the reserved word
super to invoke a constructor in parent class - super should be first action in a constructor
definition - It is included automatically by Java if it is not
there - super() calls the parent default constructor
22Example of A Constructor in a Derived Class
Student
public class Student extends Person private
int studentNumber //Default
constructor public Student()
super() studentNumber 0
- The Student constructor first calls super() which
calls a constructor in Person (which initializes
the private instance variable name). - Then, it initializes private instance variable
studentNumber to 0.
23Example of An Overloaded Constructor In Derived
Class Student
public class Student extends Person
public Student(String newName, int
newStudentNumber) super(newName)
studentNumber newStudentNumber
- This passes the parameter newName to a different
constructor in the parent class. - Then, it takes the second parameter to initialize
the local private instance variable.
24Another Option Referencing Constructors Within
A Class
public class Student extends Person
//Constructor option 2 public Student(String
newName, int newStudentNumber)
super(newName) studentNumber
newStudentNumber //Constructor option
3 public Student(String initialName)
this(initialName, 0)
- this used in a constructor references another
constructor within the class.
25Another Feature Of OOP Languages w/ Inheritance
- Derived classes have more than one type!
- They have the type of the class they define the
derived class. - They also have the type of every ancestor class
(all the way to the root).
26Inheritance Specifics For Java
- All classes derive from an original, predefined
class called Object - Object is called the Eve class since it is the
original class for all other classes. - This means that all objects have more than one
type their own and Object!
27Derived Class Type Example
Person president new Person(Steve
Horton) Employee human new Employee(Steve
Horton) if (human.sameName(president))
//Does this block execute? System.out.println(
Your employee is the president.)
Does this generate a compiler error?
- Check the type definition in the employee class
for method sameName. - This code works because the derived class
Employee has the type of both Employee and
Person. - Note the compiler checks all possible types when
resolving references this is called type
checking (it is involved!).
28Further Detail On Assignment Compatibility
- You can assign an object of a derived class to a
variable of any ancestor type - Person josephine
- Employee boss new Employee()
- josephine boss
- You cannot assign an object of an ancestor class
to a variable of a derived class type - Person josephine new Person()
- Employee boss
- boss josephine
OK
Not allowed
29III. Abstract Classes
- An abstract class is used as a base for
inheritance instead of being used to create
objects (you actually cannot create objects of an
abstract class). - Abstract classes bring structure to program
design by requiring you to supply methods that
would otherwise always be overridden. - Specify that a method is abstract if you want all
descendant classes to implement it - public abstract void drawHere()
- Note any class that has an abstract method must
be declared as an abstract class - public abstract class Figure
30Abstract Class Example
- Examine the class Figure in Savitch, Third
Edition p.455 as part of the character graphics
program. - Figure is an abstraction so no direct
implementation. It serves as a base class for
other descendant classes. - It could be defined as an abstract class.
- The method drawHere should be overridden in all
descendant classes derived from Figure based on
the specifics of each descendant class. - Hence, drawHere could be defined as abstract in
Figure.
31Savitch Character Graphics Inheritance Structure
Instance variables offset Methods setOffset getO
ffset drawAt drawHere
Instance variables offset height width Methods s
etOffset getOffset drawAt drawHere reset drawHori
zontalLine drawSides drawOneLineOfSides spaces
Instance variables offset base Methods setOffset
getOffset drawAt drawHere reset drawBase drawTop
spaces
32IV. Introduction to Dynamic Binding
- Many times a program needs to execute in a
non-sequential order. - Examples include
- Selection (if-else/switch)
- Repetition (while/do-while/for)
- Method calls
- Program must jump to memory location that
contains the method's instructions and return to
the calling program when the method is finished. - This branching requires that the complier compute
the address of the memory location to branch to. - The compiler cannot always know the address!
- Sometimes, an address can only be determined at
run time.
33Example Of Why Dynamic Binding Happens
- With inheritance, a derived class can call a
method in their parent class. - Since objects from the two classes can be created
at separate times, the compiler cannot possibly
know which address to use - Therefore, the address of the ancestor method
must be determined (bound) at run time.
34Definitions Static And Dynamic Binding
- Static binding is the process of determining
branching addresses at compile time. - Dynamic binding is the process of determining
branching addresses at runtime (or during program
execution). - Binding done at runtime is also called late
binding.
35Dynamic Binding Enables Polymorphism
- Polymorphism means having many forms
- Using the process of dynamic binding to allow
different objects to use the same method name but
perform different method actions is polymorphism - Hence, polymorphism allows us to apply a
consistent approach to inconsistent but related
behaviors - There is no specific syntax for polymorphism, it
is how you design it a combination of
inheritance and overloading.
36Examples Of Polymorphism
- Sorting data with different data types objects,
arrays, primitives, - Drawing programs that display various types of
shapes with different implementations of .draw - Use of System.out.println with different
implementations of .toString
37For Lab - Class Hierarchy For Geometric Shapes
Shape
Rectangle
Triangle
Circle
Right Triangle
Isosceles Triangle
- Does this diagram satisfy Is-a relationships?
- What are the common elements to all shapes?
- What other data is needed for each class?