Inheritance Hierarchies
-
Make an inheritance hierarchy by extending classes
-
Implement constructor chaining
-
Learn to distinguish between overloading and overriding
-
Create a project called L7
-
Create four classes called
A
,B
,C
, andMain
Your directory structure will look like this:
W4L2/ └── src ├── A.java ├── B.java ├── C.java └── Main.java
This lab introduces you to the concepts of inheritance in Java.
The basic idea is to build an inheritance hierarchy from scratch
so that you can observe some of the behavior of super and subclasses.
The example is completely artificial, but don’t worry, we’ll show you some
good examples of the benefits of inheritance later.
For the moment we want you to see the basic inheritance mechanisms of Java
.
Java
is very similar to, but not exactly the same as, other OO (object oriented)
languages such as C++
when it comes to inheritance.
The inheritance is as follows:
-
The
A
class will be the super class forB
andC
-
B
will be a subclass ofA
and a superclass ofC
-
C
will be a subclass ofB
, which is in turn a subclass ofA
Tip
|
Another name for a subclass is a derived class or child class. |
The picture below shows the inheritance hierarchy that you are building, using UML
notation:
Declare two protected fields of type double
, named x
and y
.
Complete the rest of the class using the following javadoc.
Now you’ve implemented the A
class,
open the Main
class, create a main
method and add the following code:
// Instantiate and test A
A a = new A(2.0, 4.0);
System.out.printf("x: %.1f, y: %.1f\n", a.getX(), a.getY());
System.out.printf("a: %s\n", a);
System.out.println(a.toString("A class: "));
System.out.printf("a.sum: %.1f\n", a.sum());
System.out.printf("a.product: %.1f\n", a.product());
// System.out.println("a.power: " + a.power());
System.out.println("\n");
Make class B
a subclass of class A
by adding "extends A"
to the class declaration.
This is an inheritance relationship, B
now immediately inherits all public, package private,
and protected members/methods in class A
.
Complete the rest of the code using the javadoc
Note
|
there will be a compilation error. The call to the super constructor must come before
any other code. If you’re interested, here’s some super reading (hahaha)
information.
|
Append the following code at the end of the main
method in the Main
class
Run the code and answer the following questions:
// Instantiate and test B
B b = new B(3.0, 5.0);
System.out.printf("b: %s\n", b);
System.out.println(b.toString("B class: "));
System.out.printf("b.sum: %.1f\n", b.sum());
System.out.printf("b.product: %.1f\n", b.product());
System.out.printf("b.power: %.1f\n", b.power());
System.out.println("\n");
/* Why does the super class constructor have to come before any other code?
*
*/
/* x and y were declared in class A. Why can you use x and y for the power method in class B?
*
*/
/* What changes in the code would cause B to not have the member variables x and y?
*
*/
/* What happens when you uncomment the call to a.power?
*
*
* Why can't you call the power method using an instance of class A?
*
*/
-
Go to class
C
-
Make class
C
extend classB
by adding"extends B"
to the class declaration.C
now inherits all the members and methods of classB
and classA
. -
Add a field of type
double
namedz
. -
Use the javadoc to complete the rest of the class
Append the following code at the end of the main
method in the Main
class:
// Instantiate and test C
C c = new C(2.0, 3.0, 4.0);
System.out.println("c: " + c);
System.out.println(c.toString("C class: "));
System.out.println(c.toString());
System.out.println("c.sum: " + c.sum());
System.out.println("c.product: " + c.product());
System.out.println("c.power: " + c.power());
System.out.println("\n");
In the main
method of the C
class, try calling the super class method for the sum
, product
, and power
methods.
This demonstrates the basic principle of inheritance - let the base class do
whatever work it can, the subclass extends the base class to add new functionality.
Note
|
We stayed almost completely away from polymorphism and dynamic binding, which will be in a future lab. |
Add and answer these last questions in the main
method of the Main
class.
/* When the code calls the overloaded toString(String) on the C instance,
* in which classes does it run code? HINT: use the debugger with "step into"
* to observe what classes are called. Be specific.
*
* When the code calls the original toString() on the C instance,
* in which classes does it run code?
*
* How does Java determine which version of a method to use in an inheritance hierarchy?
*
*/
Please show your code and comments to the teaching assistant or helper to get credit for this lab.