Inheritance in Java |
---|
Inheritance in java is a mechanism in which one class or object acquires all the properties(methods and fields) and behaviors of parent class or object.
extends is the keyword used to inherit the properties of a class.
Inheritance represents the IS-A relationship, also known as parent-child relationship.
Why use inheritance in java
- For Code Reusability.
- For Method Overriding (so runtime polymorphism can be achieved).
Point to be remember regarding Inheritance.
- Constructor and initilization block (SIB,IIB) are not inherit to sub class
- Every constructor should have the first statement either super() or this() calling statement
- If we are not keeping the super() or this() as a first statement in constructor ,compiler will keep super().
- Parent class also have super() keyword to Object class.
Following example demonstrate inheritance , constructor, this() and super() keyword.
class A
{
A(double d)
{
this();
System.out.println("A(double)");
}
A()
{
System.out.println("A()");
}
void test()
{
System.out.println("test()");
}
}
class B extends A
{
B()
{
super(9.3);
System.out.println("B()");
}
}
public class Demo
{
public static void main(String args[])
{
B b=new B();
b.test();
}
}
{
A(double d)
{
this();
System.out.println("A(double)");
}
A()
{
System.out.println("A()");
}
void test()
{
System.out.println("test()");
}
}
class B extends A
{
B()
{
super(9.3);
System.out.println("B()");
}
}
public class Demo
{
public static void main(String args[])
{
B b=new B();
b.test();
}
}
Output:
A()
A(double)
B()
test()
Programs for Practice on Inheritance |
---|
Program # 1
class A
{
int i;
}
class B extends A
{
int j;
public static void main(String[] args)
{
B obj1=new B();
System.out.println(obj1.i);
System.out.println(obj1.j);
}
}
{
int i;
}
class B extends A
{
int j;
public static void main(String[] args)
{
B obj1=new B();
System.out.println(obj1.i);
System.out.println(obj1.j);
}
}
Output:
0
0
Program # 2
Note: inside class D there are 3 members
class C
{
int i;
void test()
{
System.out.println("Test");
}
}
class D extends C
{
int j;
}
class E
{
public static void main(String[] args)
{
D d1=new D();
d1.i=10;
d1.j=20;
d1.test();
System.out.println(d1.i);
System.out.println(d1.j);
}
}
{
int i;
void test()
{
System.out.println("Test");
}
}
class D extends C
{
int j;
}
class E
{
public static void main(String[] args)
{
D d1=new D();
d1.i=10;
d1.j=20;
d1.test();
System.out.println(d1.i);
System.out.println(d1.j);
}
}
Output:
Test
10
20
Program # 3
class F
{
int i;
static int j;
void test1()
{
System.out.println("Test1");
}
static void test2()
{
System.out.println("Test2");
}
}
class G extends F
{
int k;
static void test3()
{
System.out.println("Test3");
}
public static void main(String[] args)
{
F.j=10;
F.test2();
G.test2();
G.test3();
System.out.println(G.j);
F f1=new F();
f1.i=20;
f1.test1();
G g1=new G();
g1.i=30;
g1.k=50;
g1.test1();
}
}
{
int i;
static int j;
void test1()
{
System.out.println("Test1");
}
static void test2()
{
System.out.println("Test2");
}
}
class G extends F
{
int k;
static void test3()
{
System.out.println("Test3");
}
public static void main(String[] args)
{
F.j=10;
F.test2();
G.test2();
G.test3();
System.out.println(G.j);
F f1=new F();
f1.i=20;
f1.test1();
G g1=new G();
g1.i=30;
g1.k=50;
g1.test1();
}
}
Output:
Test2
Test2
Test3
10
Test1
Test1
Program # 4
class H
{
int x;
}
class I extends H
{
int y;
}
class J extends I
{
int z;
}
class Manager
{
public static void main(String[] args)
{
H h1=new H();
I i1=new I();
J j1=new J();
System.out.println(h1.x);
System.out.println(i1.x);
System.out.println(j1.x);
System.out.println(i1.y);
System.out.println(j1.y);
System.out.println(j1.z);
}
}
{
int x;
}
class I extends H
{
int y;
}
class J extends I
{
int z;
}
class Manager
{
public static void main(String[] args)
{
H h1=new H();
I i1=new I();
J j1=new J();
System.out.println(h1.x);
System.out.println(i1.x);
System.out.println(j1.x);
System.out.println(i1.y);
System.out.println(j1.y);
System.out.println(j1.z);
}
}
Note: while creating the object of J all class H,I and J will load in memory
Output:
all 0
Program # 5
class K
{
K()
{
//super(); //compiler keep super() internally
System.out.println("K()");
}
}
class L extends K
{
L()
{
//super(); //compiler keep super() internally
System.out.println("L()");
}
}
class Manager
{
public static void main(String[] args)
{
K k1=new K();
System.out.println("------");
L l1=new L();
System.out.println("------");
}
}
Note:{
K()
{
//super(); //compiler keep super() internally
System.out.println("K()");
}
}
class L extends K
{
L()
{
//super(); //compiler keep super() internally
System.out.println("L()");
}
}
class Manager
{
public static void main(String[] args)
{
K k1=new K();
System.out.println("------");
L l1=new L();
System.out.println("------");
}
}
- constructor and initilization block (SIB,IIB) are not inherit to sub class
- every constructor should have the first statement either super() or this() calling statement
- if we are not keeping the super() or this() as a first statement in constructor ,compiler will keep super().
- even a parent class have super() statement to Object class.
Output:
K()
------
K()
L()
------
Program # 6
Note: Total 4 constructor are executing in this program.
class M extends Object
{
M()
{
super();
System.out.println("M()");
}
}
class N extends M
{
N()
{
super();
System.out.println("N()");
}
}
class O extends N
{
O()
{
super();
System.out.println("O()");
}
}
class Manager2
{
public static void main(String[] args)
{
M m1=new M();
System.out.println("------");
N l1=new N();
System.out.println("------");
O o1=new O();
System.out.println("------");
}
}
{
M()
{
super();
System.out.println("M()");
}
}
class N extends M
{
N()
{
super();
System.out.println("N()");
}
}
class O extends N
{
O()
{
super();
System.out.println("O()");
}
}
class Manager2
{
public static void main(String[] args)
{
M m1=new M();
System.out.println("------");
N l1=new N();
System.out.println("------");
O o1=new O();
System.out.println("------");
}
}
Output:
M()
------
M()
N()
------
M()
N()
O()
------
Program # 7
class P
{
P()
{
System.out.println("P()");
}
}
class Q extends P
{
Q()
{
System.out.println("Q()");
}
}
class R extends Q
{
R()
{
System.out.println("R()");
}
}
class S extends R
{
S()
{
System.out.println("S()");
}
}
class T extends S
{
T()
{
System.out.println("T()");
}
public static void main(String[] args)
{
P m1=new P();
System.out.println("------");
Q l1=new Q();
System.out.println("------");
R o1=new R();
System.out.println("------");
S s1=new S();
System.out.println("------");
T t1=new T();
System.out.println("------");
}
}
{
P()
{
System.out.println("P()");
}
}
class Q extends P
{
Q()
{
System.out.println("Q()");
}
}
class R extends Q
{
R()
{
System.out.println("R()");
}
}
class S extends R
{
S()
{
System.out.println("S()");
}
}
class T extends S
{
T()
{
System.out.println("T()");
}
public static void main(String[] args)
{
P m1=new P();
System.out.println("------");
Q l1=new Q();
System.out.println("------");
R o1=new R();
System.out.println("------");
S s1=new S();
System.out.println("------");
T t1=new T();
System.out.println("------");
}
}
Output:
R()
S()
------
P()
Q()
R()
S()
T()
------
Program # 8
class A
{
A()
{
System.out.println("A()");
}
A(int i)
{
System.out.println("A(int)");
}
}
class B extends A
{
B()
{
System.out.println("B()");
}
B(int i)
{
System.out.println("B(int)");
}
}
class Manager
{
public static void main(String[] args)
{
A m1=new A();
System.out.println("------");
A l1=new A(20);
System.out.println("------");
B o1=new B();
System.out.println("------");
B s1=new B(30);
System.out.println("------");
}
}
{
A()
{
System.out.println("A()");
}
A(int i)
{
System.out.println("A(int)");
}
}
class B extends A
{
B()
{
System.out.println("B()");
}
B(int i)
{
System.out.println("B(int)");
}
}
class Manager
{
public static void main(String[] args)
{
A m1=new A();
System.out.println("------");
A l1=new A(20);
System.out.println("------");
B o1=new B();
System.out.println("------");
B s1=new B(30);
System.out.println("------");
}
}
Output:
A()
------
A(int)
------
A()
B()
------
A()
B(int)
------
Program # 9
class E
{
E()
{
System.out.println("E()");
}
}
class F extends E
{
F(int i)
{
System.out.println("F(int)");
}
}
class Manager2
{
public static void main(String[] args)
{
E m1=new E();
System.out.println("------");
F l1=new F(20);
}
}
{
E()
{
System.out.println("E()");
}
}
class F extends E
{
F(int i)
{
System.out.println("F(int)");
}
}
class Manager2
{
public static void main(String[] args)
{
E m1=new E();
System.out.println("------");
F l1=new F(20);
}
}
Output:
E()
------
E()
F(int)
Program # 10
class G
{
G(int i)
{
System.out.println("G(int)");
}
}
class H extends G
{
H()
{
//super(10); if remove this super(10) will give compiler error
System.out.println("H()");
}
}
class Manager3
{
public static void main(String[] args)
{
G g1=new G(90);
System.out.println("------");
H h1=new H();
}
}
{
G(int i)
{
System.out.println("G(int)");
}
}
class H extends G
{
H()
{
//super(10); if remove this super(10) will give compiler error
System.out.println("H()");
}
}
class Manager3
{
public static void main(String[] args)
{
G g1=new G(90);
System.out.println("------");
H h1=new H();
}
}
Output:
H.java:11: cannot find symbol
symbol : constructor G()
location: class G
{
^
1 error
------------------
G(int)
------
G(int)
H()
Program # 11
class I
{
I(double j)
{
System.out.println("I(double)");
}
}
class J extends I
{
J()
{
super(9.9);
System.out.println("J()");
}
J(double d){
super(d);
System.out.println("J(double)");
}
}
class Manager4
{
public static void main(String[] args)
{
I i1=new I(9.9);
System.out.println("----------");
J j1=new J();
System.out.println("----------");
J j2=new J(3.4);
}
}
{
I(double j)
{
System.out.println("I(double)");
}
}
class J extends I
{
J()
{
super(9.9);
System.out.println("J()");
}
J(double d){
super(d);
System.out.println("J(double)");
}
}
class Manager4
{
public static void main(String[] args)
{
I i1=new I(9.9);
System.out.println("----------");
J j1=new J();
System.out.println("----------");
J j2=new J(3.4);
}
}
Output:
I(double)
----------
I(double)
J()
----------
I(double)
J(double)
Program # 12
class K
{
K()
{
System.out.println("K()");
}
{
System.out.println("K-IIB");
}
}
class L extends K
{
L()
{
System.out.println("L()");
}
{
System.out.println("L-IIB");
}
}
class Manager5
{
public static void main(String[] args)
{
K k1=new K();
System.out.println("----------");
L l1=new L();
System.out.println("----------");
}
}
{
K()
{
System.out.println("K()");
}
{
System.out.println("K-IIB");
}
}
class L extends K
{
L()
{
System.out.println("L()");
}
{
System.out.println("L-IIB");
}
}
class Manager5
{
public static void main(String[] args)
{
K k1=new K();
System.out.println("----------");
L l1=new L();
System.out.println("----------");
}
}
Output:
K-IIB
K()
----------
K-IIB
K()
L-IIB
L()
----------
Program # 13
class M
{
M()
{
System.out.println("M()");
}
{
System.out.println("M-IIB-1");
}
{
System.out.println("M-IIB-2");
}
}
class N extends M
{
N()
{
System.out.println("N()");
}
{
System.out.println("N-IIB-1");
}
{
System.out.println("N-IIB-2");
}
}
class Manager6
{
public static void main(String[] args)
{
M k1=new M();
System.out.println("----------");
N l1=new N();
System.out.println("----------");
}
}
{
M()
{
System.out.println("M()");
}
{
System.out.println("M-IIB-1");
}
{
System.out.println("M-IIB-2");
}
}
class N extends M
{
N()
{
System.out.println("N()");
}
{
System.out.println("N-IIB-1");
}
{
System.out.println("N-IIB-2");
}
}
class Manager6
{
public static void main(String[] args)
{
M k1=new M();
System.out.println("----------");
N l1=new N();
System.out.println("----------");
}
}
Output:
M-IIB-1
M-IIB-2
M()
----------
M-IIB-1
M-IIB-2
M()
N-IIB-1
N-IIB-2
N()
----------
Program # 14
class O
{
{
System.out.println("O-IIB");
}
O()
{
System.out.println("O()");
}
}
class P extends O
{
P()
{
System.out.println("P()");
}
{
System.out.println("P-IIB");
}
P(int i)
{
this();//IT will call constructor of same class
System.out.println("P(int)");
}
}
class Manager7
{
public static void main(String[] args)
{
O m1=new O();
System.out.println("------");
P o1=new P();
System.out.println("------");
P s1=new P(30);
System.out.println("------");
}
}
{
{
System.out.println("O-IIB");
}
O()
{
System.out.println("O()");
}
}
class P extends O
{
P()
{
System.out.println("P()");
}
{
System.out.println("P-IIB");
}
P(int i)
{
this();//IT will call constructor of same class
System.out.println("P(int)");
}
}
class Manager7
{
public static void main(String[] args)
{
O m1=new O();
System.out.println("------");
P o1=new P();
System.out.println("------");
P s1=new P(30);
System.out.println("------");
}
}
Output:
O-IIB
O()
------
O-IIB
O()
P-IIB
P()
------
O-IIB
O()
P-IIB
P()
P(int)
------