Module-3 Inheritance (1)
Module-3 Inheritance (1)
Module 3
Inheritance
Syllabus:
Inheritance: Inheritance, Using super, Creating a Multilevel Hierarchy, When Constructors Are Called,
Method Overriding, Dynamic Method Dispatch, Using Abstract Classes, Using final with Inheritance, The
Object Class.
3.1 Inheritance
Inheritance is one of the building blocks of object oriented programming languages. It allows creation of
classes with hierarchical relationship among them. Using inheritance, one can create a general class that
defines traits common to a set of related items. This class can then be inherited by other, more specific
classes, each adding those things that are unique to it. In the terminology of Java, a class that is inherited is
called a superclass. The class that does the inheriting is called a subclass. Therefore, a subclass is a
specialized version of a superclass. It inherits all of the instance variables and methods defined by the
superclass and add its own, unique elements. Through inheritance, one can achieve re-usability of the code.
In Java, inheritance is achieved using the keyword extends. The syntax is given below:
class A //super class
{
//members of class A
}
class A
{
int i, j;
void showij()
{
System.out.println("i and j: " + i + " " + j);
}
}
class B extends A
{
int k;
void showk()
{
[Type here] [Type here] [Type here]
class SimpleInheritance
{
public static void main(String args[])
{
A superOb = new A();B
subOb = new B();
superOb.i = 10;
superOb.j = 20; System.out.println("Contents of
superOb: ");superOb.showij();
subOb.i = 7;
subOb.j = 8;
subOb.k = 9;
System.out.println("Contents of subOb: ");
subOb.showij();
subOb.showk();
Note that, private members of the super class can not be accessed by the sub class. The subclass contains all
non-private members of the super class and also it contains its own set of members to achieve specialization.
3.1.1Type of Inheritance
Single Inheritance: If a class is inherited from one parent class, then it is known as single
inheritance. This will be of the form as shown below –
superclass
subclass
Multilevel Inheritance
In Multilevel Inheritance, a derived class will be inheriting a base class, and as well as the derived class also
acts as the base class for other classes. In the below image, class A serves as a base class for the derived
class B, which in turn serves as a base class for the derived class C. In Java, a class cannot directly access
the grandparent’s members.
Hierarchical Inheritance
In Hierarchical Inheritance, one class serves as a superclass (base class) for more than one subclass. In the
below image, class A serves as a base class for the derived classes B, C, and D.
Hybrid Inheritance
It is a mix of two or more of the above types of inheritance. Since Java doesn’t support multiple
inheritances with classes, hybrid inheritance involving multiple inheritance is also not possible with
classes. In Java, we can achieve hybrid inheritance only through Interfaces if we want to involve
multiple inheritance to implement Hybrid inheritance.
However, it is important to note that Hybrid inheritance does not necessarily require the use of
Multiple Inheritance exclusively. It can be achieved through a combination of Multilevel Inheritance
and Hierarchical Inheritance with classes, Hierarchical and Single Inheritance with classes.
Therefore, it is indeed possible to implement Hybrid inheritance using classes alone, without relying
on multiple inheritance type.
class Base
{
void dispB()
{
System.out.println("Super class " );
}
}
class Derived extends Base
{
void dispD()
{
System.out.println("Sub class ");
}
}
class Demo
{
public static void main(String args[])
{
Base b = new Base();
[Type here] [Type here] [Type here]
Note that, the type of reference variable decides the members that can be accessed, but not the type of the
actual object. That is, when a reference to a subclass object is assigned to a superclass reference variable,
you will have access only to those parts of the object defined by the superclass.
Using super
In Java, the keyword super can be used in following situations:
To invoke superclass constructor within the subclass constructor
To access superclass member (variable or method) when there is a duplicate member name in
the subclass
class Box
{
double w, h, b;
Also, if the data members of super class are private, then we can’t even write such a code in subclass
constructor. If we use super() to call superclass constructor, then it must be the first statement executed
inside a subclass constructor as shown below –
class Box
[Type here] [Type here] [Type here]
{
double w, h, b;
Box(double wd, double ht, double br)
{
w=wd; h=ht; b=br;
}
}
class Demo
{
public static void main(String args[])
{
ColourBox b=new ColourBox(2,3,4, 5);
}
}
Here, we are creating the object b of the subclass ColourBox . So, the constructor of this class is invoked.
As the first statement within it is super(wd, ht, br), the constructor of superclass Box is invoked, and then
the rest of the statements in subclass constructor ColourBox are executed.
To access superclass member variable when there is a duplicate variable name in the subclass:
This form of super is most applicable to situations in which member names of a subclass hide
members by the same name in the superclass.
class A
{
int a;
}
class B extends A
{
int a; //duplicate variable a
B(int x, int y)
{
super.a=x; //accessing superclass a
a=y; //accessing own member a
[Type here] [Type here] [Type here]
void disp()
{
System.out.println("super class a: "+ super.a);
System.out.println("sub class a: "+ a);
}
}
class SuperDemo
{
public static void main(String args[])
{
B ob=new B(2,3);
ob.disp();
}
}
class A
{ int a;
}
class B extends A
{ int b;
}
class C extends B
{ int c;
class MultiLevel
{
public static void main(String args[])
[Type here] [Type here] [Type here]
{
C ob=new C(2,3,4);
ob.disp();
}
}
class A
{
A()
{
System.out.println("A's constructor.");
}
}
class B extends A
{
B()
{
System.out.println("B's constructor.");
}
}
class C extends B
{
[Type here] [Type here] [Type here]
C()
{
System.out.println("C's constructor.");
}
}
class CallingCons
{
public static void main(String args[])
{
C c = new C();
}
}
Output:
A's constructor B's
constructor C's
constructor
class A
{
int i, j; A(int a,
int b)
{
i = a;j =
b;
}
void show() //suppressed
{
System.out.println("i and j: " + i + " " + j);
}
}
class B extends A
{
int k;
B(int a, int b, int c)
{
super(a, b);k =
[Type here] [Type here] [Type here]
c;
}
void show() //Overridden method
{
System.out.println("k: " + k);
}
}
class Override
{
public static void main(String args[])
{
B subOb = new B(1, 2, 3);
subOb.show();
}
}
Output:
k: 3
Note that, above program, only subclass method show() got called and hence only k got displayed. That is,
the show() method of super class is suppressed. If we want superclass method also to be called, we can re-
write the show() method in subclass as –
void show()
{
super.show(); // this calls A's show()
System.out.println("k: " + k);
}
Method overriding occurs only when the names and the type signatures of the two methods (one in
superclass and the other in subclass) are identical. If two methods (one in superclass and the other in
subclass) have same name, but different signature, then the two methods are simply overloaded.
class A
{
void callme()
{
System.out.println("Inside A");
}
}
class B extends A
{
void callme()
{
System.out.println("Inside B");
}
}
class C extends A
{
void callme()
{
System.out.println("Inside C");
}
}
class Dispatch
{
public static void main(String args[])
{
A a = new A();B b
= new B(); C c =
new C();
A r; //Superclass reference
r = a; //holding subclass object
r.callme();r =
b; r.callme();r
= c; r.callme();
}
}
A class containing at least one abstract method is called as abstract class. Abstract classes can not be
instantiated, that is one cannot create an object of abstract class. Whereas, a reference can be created for an
abstract class.
abstract class A
{
abstract void callme();void
callmetoo()
{
System.out.println("This is a concrete method.");
}
}
class B extends A
{
void callme() //overriding abstract method
{
System.out.println("B's implementation of callme.");
}
}
class AbstractDemo
{
public static void main(String args[])
{
B b = new B(); //subclass object b.callme(); //calling
abstract methodb.callmetoo(); //calling concrete method
}
}
Example: Develop a JAVA program to create an abstract class Shape with abstract methods
calculateArea() and calculatePerimeter(). Create subclasses Circle and Triangle that extend the
Shape class and implement the respective methods to calculate the area and perimeter of each
shape(LAB Program)
@Override
public double calculatePerimeter() {
return 2 * Math.PI * radius;
}
}
@Override
public double calculatePerimeter() {
return side1 + side2 + side3;
}
}
System.out.println();
Explanation:
Shape is an abstract class with abstract methods calculateArea() and calculatePerimeter(). These methods will
be implemented by the subclasses.
[Type here] [Type here] [Type here]
Circle is a subclass of Shape with a constructor that takes the radius as a parameter. It implements the abstract
methods calculateArea() and calculatePerimeter() based on the formulas for the area and perimeter of a circle.
Triangle is another subclass of Shape with a constructor that takes the lengths of its three sides as parameters.
It implements the abstract methods calculateArea() and calculatePerimeter() using Heron's formula for the
area and simple addition for the perimeter.
The Main class demonstrates the usage of the Circle and Triangle classes by creating instances of each and
calling their respective methods to calculate area and perimeter.
3.6 Using final
The keyword final can be used in three situations in Java:
3.6.1 To create the equivalent of a named constant.
3.6.2 To prevent method overriding
3.6.3 To prevent Inheritance
To create the equivalent of a named constant: A variable can be declared as final. Doing so prevents its
contents from being modified. This means that you must initialize a final variable when it is declared. For
example:
final int FILE_NEW = 1;
final int FILE_OPEN = 2;
final int FILE_SAVE = 3;
final int FILE_SAVEAS =
4;final int FILE_QUIT = 5;
It is a common coding convention to choose all uppercase identifiers for final variables. Variables declared
as final do not occupy memory on a per-instance basis. Thus, a final variable is essentially a constant.
To prevent Inheritance: As we have discussed earlier, the subclass is treated as a specialized class and
superclass is most generalized class. During multi-level inheritance, the bottom most class will be with all
[Type here] [Type here] [Type here]
the features of real-time and hence it should not be inherited further. In such situations, we can prevent a
particular class from inheriting further, using the keyword final. For example –
final class A
{
// ...
}
class B extends A // ERROR! Can't subclass A
{
// ...
}
Note:
3.6.4 Declaring a class as final implicitly declares all of its methods as final, too.
3.6.5 It is illegal to declare a class as both abstract and final since an abstract class is
incomplete byitself and relies upon its subclasses to provide complete implementations
Method Purpose
Object clone( ) Creates a new object that is the same as the object being cloned.
void notifyAll( ) Resumes execution of all threads waiting on the invoking object.
The methods getClass( ), notify( ), notifyAll( ), and wait( ) are declared as final. You may override the
others. The equals( ) method compares the contents of two objects. It returns true if the objects are
[Type here] [Type here] [Type here]
equivalent, and false otherwise. The precise definition of equality can vary, depending on the type of
objects being compared. The toString( ) method returns a string that contains a description ofthe object
on which it is called. Also, this method is automatically called when an object is outputusing
println( ). Many classes override this method.