Inheritance in Java – Implementing Step by Step

Inheritance in Java: Inheritance के एक सबसे सरल उदाहरण में भी कम से कम दो Classes होती हैं। मूल Class को जावा में Super Class कहा जाता है जबकि “C++” में इसे Base Class कहा जाता है। इसी तरह से मूल Class से Derive की जाने वाली Class को जावा में Sub Class कहा जाता है, जबकि “C++” में Inherit होने वाली Class को Derived Class कहा जाता है।

जावा में किसी Super Class के गुणों को किसी नई Class में Derive करने के लिए हमें extends Keyword का प्रयोग करना होता है। जब हम किसी Super Class के गुणों को किसी Sub Class में Inherit करते हैं, तब वास्तव में हम Super Class के General गुणों को अपनी जरूरत के आधार पर बढा रहे होते हैं। इसलिए जावा में Inheritance की इस प्रक्रिया को हम Super Class को Extend करना भी कह सकते हैं।

इस Concept के आधार पर जावा में extends Keyword को Add किया गया है। इस Keyword का प्रयोग करके हम किसी Super Class के गुणों को किसी Derived या Sub Class में प्राप्त करते हैं। जावा में इस काम को करने के लिए यानी किसी Super Class के गुणों को Sub Class में Inherit करने के लिए हमें निम्नानुसार Syntax का प्रयोग करना होता है:

	public class <SuperClassName>
	{ 
		// Attributes and Methods
	}
	
	public class <SubClassName> extends <SuperClassName>
	{ 
		// Attributes and Methods
	}

इस Code Segment में extends का मतलब ये होता है कि हम Super Class को Extend करके एक नई Sub Class बना रहे हैं, जिसमें Super Class के तो सभी Instance Member व Methods होते ही हैं, साथ ही Sub Class के स्वयं के भी कुछ Special Instance Members व Methods हो सकते हैं। Super Class के Data Members व Methods के Access Specifies के आधार पर ही ये तय होता है कि Sub Class Super Class के किन Data Members व Methods को किस हद तक Access करने में सक्षम होगा व किस स्थिति में Access करने में सक्षम होगा।

OOPS का एक सामान्‍य सा नियम ये होता है कि किसी भी Object के Data Members को Access करने के लिए उसी Object के Methods ही सक्षम होते हैं। इसलिए सामान्‍यतया किसी भी Super Class के Data Members को Private रखा जाता है। जबकि इन Data Members को Access करने के लिए इन्हीं की Classes में कुछ Public Member Functions या Public Methods होते हैं। इन Methods का प्रयोग करके ही कोई Outer Method इस Class के Data को Access कर सकता है। Inheritance में Access Specifier काफी महत्वपूर्ण काम करते हैं।

इनके आधार पर ही किसी Object की कुल क्षमता का पता लग पाता है, कि कोई Specific Object क्या-क्या करने में सक्षम है। जावा में कुल चार प्रकार के Access Specifier होते हैं जो Class के Inherit होने की क्षमता को निर्धारित करते हैं। जब हम किसी Class को Create करते समय किसी Access Specifier का प्रयोग नहीं करते हैं, तब Class Default Access Specifier का प्रयोग करता है।

Default Access Specifier के आधार पर Create होने वाली Classes जिस Package में होती हैं, उन्हें उसी Package की सभी अन्‍य Classes Directly Access करने में सक्षम होती हैं। लेकिन किसी दूसरे Package की Class Default Access Specifier वाली Class को Access नहीं कर सकती है।

// Program
	// File Name : InheritanceDemo
	class Employee
	{
		int ID;		// By Default Friend Data Members
		String name;	// By Default Friend Data Members
	}
	
	class Scientist extends Employee
	{
		float salary;	// By Default Friend Data Members
	}
	
	class InheritanceDemo
	{
		public static void main(String args[])
		{
			Employee you = new Employee();
			Scientist me = new Scientist();
		
			you.ID = 1000;
			you.name = "Mohan";
	
			me.ID = 2000;
			me.name = "Govind";
	
		//	you.salary = 12000;  Error: 
		// Employee does not know about salary Data Member of Scientist
			me.salary = 15000;		
			
			System.out.println("Your Information");
			System.out.println("\tName : " + you.name);
			System.out.println("\tID   : " + you.ID);
	
			System.out.println("\nMy Information");
			System.out.println("\tName   : " + me.name);
			System.out.println("\tID     : " + me.ID);
			System.out.println("\tSalary : " + me.salary);
		}
	}

// Output 
   Your Information
        Name : Mohan
        ID   : 1000

   My Information
        Name   : Govind
        ID     : 2000
        Salary : 15000.0

इस उदाहरण में हमने दोनों ही Classes को एक ही Program File में Create किया है। जब हम एक ही Program File में Super Class व Sub Class दोनों को Create करते हैं, उस स्थिति में यदि हम Classes के साथ किसी भी Access Specifier का प्रयोग ना करें, तब भी Program में किसी तरह की कोई Error नहीं आती है।

इसी तरह से यदि हम Super Class व Sub Class को दो अलग Files में रखते हैं और main() Method Class की File को भी अलग से लिखते हैं, लेकिन तीनों ही Classes को समान Folder में Store करते हैं, तो भी सभी Classes बिना किसी व्‍यवधान के आपस में Communication कर लेती हैं, चाहे हमने विभिन्न Classes को public Specifier के साथ Create ना किया हो।

ऐसा इसलिए सम्भव है, क्योंकि जब हम किसी Class को Create करते समय किसी Access Specifier का प्रयोग नहीं करते हैं, तब सभी Classes Default Access Specifier का प्रयोग करके Create होती हैं। इस स्थिति में ऐसी सभी Classes एक दूसरे की Friend होती हैं। इसलिए सभी Classes को समान Package की सभी अन्‍य Classes Directly Use कर सकती हैं।

हालांकि हमने अभी तक Package नहीं बनाया है, लेकिन फिर भी हम ये मान सकते हैं कि आपस में Communicate करने वाली विभिन्न Class Files समान Folder में Stored हैं, इसलिए वह Folder एक Package के समान ही है और एक ही Package या एक ही Folder में Stored सभी Class Files आपस में Friend होने की वजह से Directly Communicate करने मे सक्षम होती हैं।

हमारे इस उदाहरण में Employee Class एक Super Class है, जिसमें दो Data Members हैं, जबकि Scientist Class Employee Class की Sub Class है, जिसमें एक Data Member है। जावा में किसी Class के सभी Data Member व Methods By Default friendly होते हैं।

जावा में friendly कोई Keyword नहीं है बल्कि Access Level Specify करने का एक माध्‍यम है और जब भी हम किसी Class या Class के Members (Data Member and Methods) के साथ किसी Access Specifier का प्रयोग नहीं करते हैं, तब Default Access Specifier के रूप में Friendly Access Specifier Apply हो जाता है।

इसी वजह से main() Method में हमने Super Class Employee व Sub Class Scientist दोनों के Data Members को Dot Operator का प्रयोग करके Directly Access कर लिया है। लेकिन सामान्‍यतया किसी भी Class के Data Members को Public या Friendly नहीं रखा जाता है।

यदि Data Member को Public रखा जाता है, तो Data की कोई सुरक्षा नहीं रहती है और इन Data Members के Data को कोई भी Method Change कर सकता है, जैसाकि हमने main() Method में Super Class व Sub Class दोनों ही Classes के Members को Directly Value Assignment किया है।

जब हम Data की सुरक्षा की बात करते हैं, तब हमें किसी भी Class के Data को Private रखना होता है। किसी Data Member को Private रखने के लिए हमें Data Member Declare करते समय private Keyword का प्रयोग करना होता है। लेकिन जब हम किसी Class के किसी Data Member को Private Declare करते हैं, तब हम उस Class के उस Private Data को किसी भी अन्‍य Class में Directly Access नहीं कर सकते हैं।

इस स्थिति में हमें ऐसे Methods बनाने होते हैं जो Public या Friendly होते हैं और क्योंकि हम Public Methods को Directly किसी भी Class में Access कर सकते हैं, इसलिए हमें इन Public Methods द्वारा ही किसी भी Class के Private Data को Access करने की सुविधा प्राप्त होती है। यानी यदि हम पिछले Program के ही Data Members को Modify करके Private कर दें] और Program को Compile करें, तो हमें निम्नानुसार Compile Time Error प्राप्त होती है:

Program
	class Employee
	{
		private int ID;		
		private String name;	
	}
	
	class Scientist extends Employee
	{
		private float salary;	
	}
	
	class InheritanceDemo
	{
		public static void main(String args[])
		{
			Employee you = new Employee();
			Scientist me = new Scientist();
		
			you.ID = 1000;
			you.name = "Mohan";
	
			me.ID = 2000;
			me.name = "Govind";
	
			//	you.salary = 12000;  Error: 
			// Employee Class does not know about salary Data Member
			me.salary = 15000;		
	
			System.out.println("Your Information");
			System.out.println("\tName : " + you.name);
			System.out.println("\tID   : " + you.ID);
	
			System.out.println("\n\nMy Information");
			System.out.println("\tName   : " + me.name);
			System.out.println("\tID     : " + me.ID);
			System.out.println("\tSalary : " + me.salary);
		}
	}

Output 
D:\Java\InheritanceDemo.java:20: ID has private access in Employee
                you.ID = 1000;
                   ^
D:\Java\InheritanceDemo.java:21: name has private access in Employee
                you.name = "Mohan";
                   ^
D:\Java\InheritanceDemo.java:23: ID has private access in Employee
                me.ID = 2000;
                  ^
D:\Java\InheritanceDemo.java:24: name has private access in Employee
                me.name = "Govind";
                  ^
D:\Java\InheritanceDemo.java:28: salary has private access in Scientist
                me.salary = 15000;
                  ^
D:\Java\InheritanceDemo.java:32: name has private access in Employee
                System.out.println("\tName : " + you.name);
                                                         ^
D:\Java\InheritanceDemo.java:33: ID has private access in Employee
                System.out.println("\tID   : " + you.ID);
                                                         ^
D:\Java\InheritanceDemo.java:36: name has private access in Employee
                System.out.println("\tName   : " + me.name);
                                                        ^
D:\Java\InheritanceDemo.java:37: ID has private access in Employee
                System.out.println("\tID     : " + me.ID);
                                                        ^
D:\Java\InheritanceDemo.java:38: salary has private access in Scientist
                System.out.println("\tSalary : " + me.salary);
                                                        ^
	10 errors

यानी यदि हमें किसी Class के Private Data को किसी दूसरी Class में Use करना हो, तो हमें उसी Class के Public Methods का प्रयोग करना पडता है। जिस तरह से हम किसी Class के Data Members को Private Declare कर सकते हैं, उसी तरह से हम किसी Class के Methods को भी Private Declare कर सकते हैं। लेकिन यहां भी ठीक वही नियम लागू होता है कि हम बिना किसी Public Method के किसी Class के Private Method को भी Access नहीं कर सकते हैं।

इसलिए सारांश ये हुआ कि किसी भी Class के Data को हमेंशा Private रखा जाता है और उस Class के Data को Access करने के लिए हमें Public Methods की जरूरत होती है। अब चूंकि हमने पिछले Program में दोनों ही Classes के Data Members को Private कर दिया है, इसलिए इन Data Members को Access करने के लिए हमें उन्हीं Classes में Public Methods Define करने होंगे और उन्हीं Public Methods द्वारा उनके Private Data को Access करना होगा। इस स्थिति में हमें उपरोक्त Program को निम्नानुसार Modify करना होगा:

// Program 
	class Employee
	{
		private int ID;		
		private String name;	
	
		public void setEmpData(int empID, String empName)
		{
			ID = empID;
			name = empName;
		}
		public void showEmpData()
		{
			System.out.println("\tName   : " + name);
			System.out.println("\tID     : " + ID);
		}
	}
	
	class Scientist extends Employee
	{
		private float salary;	
	
		public void setScientistData(float sciSalary)
		{
			salary = sciSalary;
		}
		public void showScientistData()
		{
			System.out.println("\tSalary : " + salary);
		}
	}
	
	class ModifiedInheritanceDemo
	{
		public static void main(String args[])
		{
			Employee you = new Employee();
			Scientist me = new Scientist();
			you.setEmpData(1000, "Mohan");
			me.setEmpData(2000, "Govind");
			me.setScientistData(15000);
			System.out.println("Your Information");
			you.showEmpData();
			System.out.println("\nMy Information");
			me.showEmpData();
			me.showScientistData();
		}
	}

// Output 
   Your Information
        Name   : Mohan
        ID     : 1000

   My Information
        Name   : Govind
        ID     : 2000
        Salary : 15000.0

Real World में भी हम देखते हैं कि हर Scientist Object Employee हो सकता है, लेकिन हर Employee Scientist नहीं हो सकता। यानी हर Scientist एक प्रकार का (Kind Of) Employee हो सकता है लेकिन हर Employee एक प्रकार का Scientist नहीं हो सकता। सारांश के रूप में हम ये भी कह सकते हैं कि Super Class व Sub Class दोनों में “Kind Of” Relationship होती है।

एक Derived Class या Sub Class में उसकी Super Class के सभी Data Members व Methods Inherit होते हैं, इसलिए Sub Class हमेंशा अपनी Super Class के सभी Data Members व Methods के बारे में जानता होता है। यानी एक Sub Class अपनी Class के Members को तो Access कर ही सकता है, साथ ही अपनी Super Class के Members को भी Access कर सकता है।

लेकिन एक Super Class केवल अपने ही Members को Access करने में सक्षम होता है। उसकी Sub Class में कौनसे नए Members Add किए गए हैं, इसकी जानकारी Super Class को कभी भी नहीं होती है। यही वजह है कि InheritanceDemo Program में Employee Super Class का Object Scientist Sub Class के Object के salary Data Member को Access नहीं कर सकता है।

इस Program में हमने you.salary Statement को Comment बनाया है। यदि हम इसे एक Normal Statement बना दें, तो Program Compile नहीं होता है। क्योंकि Super Class के Object को Sub Class के Data Member के बारे में कभी भी कोई जानकारी नहीं होती है।

Default Access Specifier, Public Access Specifier, Private Access Specifier व Protected Access Specifier इन सभी Access Specifier को Data Members, Methods व Class तीनों के साथ उनके Scope को Specify करने के लिए Use किया जाता है। Private Access Specifier को केवल Data Members, Methods व Inner Classes के लिए ही Use किया जा सकता है।

जबकि Public Access Specifier का प्रयोग Class, Methods व Data Members के साथ कर सकते हैं, लेकिन किसी Inner Class के साथ हम Public Access Specifier का प्रयोग नहीं कर सकते हैं। हम जिस किसी भी Inner Class, Method या Data Member को Protected Declare करते हैं, उसे उसकी Derived Classes में Directly Access किया जा सकता है।

यानी Protected Access Specifier का प्रयोग करके Define की गई Inner Class, Method या Data Members को केवल उनकी Derived Classes या Sub Classes में ही Directly Access किया जा सकता है। शेष Classes के लिए ये पूरी तरह से Private या Inaccessible रहते हैं।

हम किसी External Class को Protected Define नहीं कर सकते हैं। इस Discussion के आधार पर यदि हम पिछले Program में Use किए गए विभिन्न प्रकार के Access Specifier को हटा दें, तो भी हमारा Program सामान्‍य तरीके से काम करता है, क्योंकि उस स्थिति में भी सभी Classes, Data Members व Methods Friendly Access Level में होते हैं।

Java Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Java in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

Java Programming Language in Hindi | Page: 682 | Format: PDF

BUY NOW GET DEMO REVIEWS