View
215
Download
0
Category
Preview:
DESCRIPTION
Chapter Objectives (continued) To understand why Java does not implement multiple inheritance and to see how you can gain some of the advantages of multiple inheritance through interfaces and delegation To become familiar with a class hierarchy for drawable shapes To be introduced to an object factory and to learn how to use it To understand how to create packages and to learn more about visibility To understand why Java does not implement multiple inheritance and to see how you can gain some of the advantages of multiple inheritance through interfaces and delegation To become familiar with a class hierarchy for drawable shapes To be introduced to an object factory and to learn how to use it To understand how to create packages and to learn more about visibility
Citation preview
Inheritance and Class Hierarchies
Chapter 3
Chapter Objectives To understand inheritance and how it facilitates
code reuse To understand how Java determines which method
to execute when there are multiple methods with the same name in a class hierarchy
To learn how to define and use abstract classes as base classes in a hierarchy
To study class Object and its methods and to learn how to override them
To learn how to “clone” an object and to understand the difference between a true clone (deep copy) and a shallow copy
Chapter Objectives (continued)
To understand why Java does not implement multiple inheritance and to see how you can gain some of the advantages of multiple inheritance through interfaces and delegation
To become familiar with a class hierarchy for drawable shapes
To be introduced to an object factory and to learn how to use it
To understand how to create packages and to learn more about visibility
Introduction to Inheritance and Class Hierarchies
Popularity of OOP is that it enables programmers to reuse previously written code saved as classes
All Java classes are arranged in a hierarchy, starting with Object, which is the superclass of all Java classes
Inheritance in OOP is analogous to inheritance in humans
Inheritance and hierarchical organization allow you to capture the idea that one thing may be a refinement or extension of another
Is-a Versus Has-a Relationships
One misuse of inheritance is confusing the has-a relationship with the is-a relationship
The has-a relationship means that one class has the second class as an attribute
We can combine is-a and has-a relationships The keyword extends specifies that one class is a
subclass of another
A Superclass and a Subclass Consider two classes: Computer and Laptop A laptop is a kind of computer and is therefore a
subclass of computer
Initializing Data Fields in a Subclass and the No-
Parameter Constructor Private data fields belonging to a base class must be
initialized by invoking the base class’s constructor with the appropriate parameters
If the execution of any constructor in a subclass does not invoke a superclass constructor, Java automatically invokes the no-parameter constructor for the superclass Initializes that part of the object inherited from
the superclass before the subclass starts to initialize its part of the object
Protected Visibility for Superclass Data Fields
Private data fields are not accessible to derived classes
Protected visibility allows data fields to be accessed either by the class defining it or any subclass
In general, it is better to use private visibility because subclasses may be written by different programmers and it is always good practice to restrict and control access to the superclass data fields
Method Overriding If a derived class has a method
found within its base class, that method will override the base class’s method
The keyword super can be used to gain access to superclass methods overridden by the base class
A subclass method must have the same return type as the corresponding superclass method
Method Overloading Method overloading: having multiple methods with
the same name but different signatures in a class Constructors are often overloaded Example:
MyClass(int inputA, int inputB) MyClass(int inputA, int inputB, double inputC)
Polymorphism A variable of a superclass type can reference an
object of a subclass type Polymorphism means many forms or many shapes Polymorphism allows the JVM to determine which
method to invoke at run time At compile time, the Java compiler can’t determine
what type of object a superclass may reference but it is known at run time
Abstract Classes, Assignment, and Casting in a Hierarchy
An interface can declare methods but does not provide an implementation of those methods Methods declared in an interface are called
abstract methods An abstract class can have abstract methods, data
fields, and concrete methods Abstract class differs from a concrete class in that
An abstract class cannot be instantiated An abstract class can declare abstract methods,
which must be implemented in its subclasses
Abstract Classes and Interfaces
Like an interface, an abstract class can’t be instantiated
An abstract class can have constructors to initialize its data fields when a new subclass is created Subclass uses super(…) to call the constructor
May implement an interface but it doesn’t have to define all of the methods declared in the interface Implementation is left to its subclasses
Abstract Class Number and the Java Wrapper Classes
Summary of Features of Actual Classes, Abstract Classes, and
Interfaces
Class Object, Casting and Cloning
Object is the root of the class hierarchy; every class has Object as a superclass
All classes inherit the methods defined in class Object but may be overridden
The Method toString You should always override the toString method if
you want to represent an object’s state If you do not override it, the toString method for
class Object will return a string…just not the string you want or are expecting
Operations Determined by Type of Reference Variable
A variable can reference an object whose type is a subclass of the variable type
The type of reference, not the type of the object referenced, determines what operations can be performed
Java is a strongly typed language so the compiler always verifies that the type of the expression being assigned is compatible with the variable type
Casting in a Class Hierarchy Java provides casting to enable us to process one
object referenced by one type through a reference variable of its actual type
Casting does not change the object referenced; it creates an anonymous reference to that object
Downcast: cast a higher type to a lower type The instanceof operator can guard against
ClassCastException errors You can downcast an interface reference to the
specific implementation type
Java 5.0 Reduces Need for Casting
Two new features that reduce the need for casting: Autoboxing/unboxing Generics
Autoboxing/unboxing eases the conversion between a primitive type and its corresponding wrapper type
The Method Object.equals The Object.equals method has a parameter of type
Object Compares two objects to determine whether they
are equal You must override the equals method if you want to
be able to compare two objects of a class
Cloning The purpose of cloning in object-oriented
programming is analogous to cloning in biology Create an independent copy of an object
Initially, both objects will store the same information You can change one object without affecting the
other
Will cause both e1.name and e2.name to reference “Jim”
The Shallow Copy Problem
The statement e1.setAddressLine1("Room 224"); creates a new String object that is referenced by e1.address.line1 and e2.address.line1
The Object.clone method Java provides the Object.clone method to help solve
the shallow copy problem The initial copy is a shallow copy as the current
object’s data fields are copied To make a deep copy, you must create cloned
copies of all components by invoking their respective clone methods
The Object.clone method (continued)
After e1.setAddressLine1("Room 224"); only e1.address.line1 references the new String object.
Employee.clone()
Address.clone()
Multiple Inheritance, Multiple Interfaces, and Delegation
Multiple inheritance: the ability to extend more than one class
Multiple inheritance is a language feature that is difficult to implement and can lead to ambiguity Therefore, Java does not allow a class to extend
more than one class
Using Multiple Interfaces to Emulate Multiple Inheritance
If we define two interfaces, a class can implement both
Multiple interfaces emulate multiple inheritance
Using Multiple Interfaces to Emulate Multiple Inheritance
(continued)
Implementing Reuse Through Delegation
You can reduce duplication of modifications and reduce problems associated with version control through a technique known as delegation
In delegation, a method of one class accomplishes an operation by delegating it to a method of another class
Packages The Java API is organized into packages The package to which a class belongs is declared by
the first statement in the file in which the class is defined using the keyword package followed by the package name
All classes in the same package are stored in the same directory or folder
All the classes in one folder must declare themselves to be in the same package
Classes that are not part of a package may access only public members of classes in the package
The No-Package-Declared Environment and Package
Visibility There exists a default package
Files that do specify a package are considered part of the default package
If you don’t declare packages, all of your packages belong to the same, default package
Package visibility sits between private and protected Classes, data fields, and methods with
package visibility are accessible to all other methods of the same package but are not accessible to methods outside of the package
Classes, data fields, and methods that are declared protected are visible to all members of the package
Visibility Supports Encapsulation
The rules for visibility control how encapsulation occurs in a Java program
Private visibility is for members of a class that should not be accessible to anyone but the class, not even the classes that extend it
Package visibility allows the developer of a library to shield classes and class members from classes outside the package
Use of protected visibility allows the package developer to give control to other programmers who want to extend classes in the package
Table 3.3 Private Visibility
Classes : Applicable to inner classes. Accessible only to members of the class in which it is declared.
Class Members: Visible only within this class. Default (or package) Visibility
Classes : Visible to classes in this package. Class Members : Visible to classes in this package.
Protected Visibility Classes : Applicable to inner classes. Visible to
classes in this package and to classes outside the package that extend the class in which it is declared.
Class Members : Visible to classes in this package and to classes outside the package that extend this class.
Public Visibility Classes: Visible to all classes. Class Members : Visible to all classes. The class
defining the member must also be public.
Visibility Supports Encapsulation (continued)
A Shape Class Hierarchy
A Shape Class Hierarchy (continued)
A Shape Class Hierarchy (continued)
Object Factories An object factory is a method that creates instances
of other classes Object factories are useful when:
The necessary parameters are not known or must be derived via computation
The appropriate implementation of an interface or abstract class should be selected as the result of some computation
Object Factories (continued)
Chapter Review Inheritance and class hierarchies to capture the idea
that one thing may be a refinement or extension of another
Encapsulation and inheritance impose structure on object abstractions
The keyword interface defines an interface The keyword abstract defines an abstract class or
method Delegation gains some of the advantages of multiple
inheritance Visibility is influenced by the package in which a
class is declared
Recommended