Runtime Polymorphism in Java – Dynamic Method Dispatch

Runtime Polymorphism in Java: Method Overriding जावा का एक बहुत ही महत्वपूर्ण Concept है, क्योंकि इसके प्रयोग द्वारा हमें जावा में Dynamic Method Dispatch की सुविधा प्राप्त होती है, जो कि जावा का सबसे महत्वपूर्ण व Powerful Concept है। Dynamic Method Dispatch एक ऐसा तरीका है, जो Program के Runtime में ये तय करता है कि किसी Object के Reference में कौनसा Method Execute होगा ना कि Compile Time में। Dynamic Method Dispatch इसीलिए महत्वपूर्ण है क्योंकि यही वह तरीका है जिससे जावा Run Time Polymorphism को Implement करता है।

हमने पहले भी बताया था कि एक Super Class का Object उस Class की सभी Sub Classes के Objects को Refer कर सकता है। जावा इस Concept को Use करके Program के Run Time में ये तय कर सकता है कि उसे किस Method को Call करना है। चलिए, Run Time Polymorphism की इस तकनीक को समझने की कोशिश करते हैं।

जब किसी Super Class Object के Reference में किसी Overridden Method को Call किया जाता है, तब जावा को ये तय करना पडता है कि Object के लिए इस Overridden Method के Super Class के Method को Call करना है या Sub Class के Overridden Method को Call करना है। ये तय करने के लिए जावा उस Object की Class का पता लगाता है और ये Identify करता है कि Overridden Method को Call करने वाला वह Object किस Class का है। यदि Object Sub Class का होता है, तो जावा Sub Class के Overridden Method को Call कर लेता है, जबकि यदि Object Super Class का होता है, तो जावा Super Class के Overridden Method को Call कर लेता है। जावा ये निर्णय Program के Run Time में लेता है, इसलिए इस प्रक्रिया को Dynamic Method Dispatch या Run time Polymorphism कहा जाता है।

चूंकि एक Super Class Object अपनी किसी भी Sub Class के Object को Refer कर सकता है, इसलिए हम Super Class के किसी भी Object को उसी Class की किसी भी Sub Class के Object का Reference Assign कर सकते हैं। इस स्थिति में जब हम Super Class के Object के लिए किसी Overridden Method को Call करेंगे, तब जावा उस Super Class के Object के Reference से ये पता लगा लेगा कि उसमें किस Sub Class Object का Reference है।

Super Class के इस Object में जिस Sub Class के Object का Reference होगा, जावा उसी Sub Class के Overridden Method को Call कर लेगा। इस प्रकार की स्थिति में हम हमारे Program में एक ही प्रकार का Statement लिखते हैं, लेकिन हर Statement Run Time में ये तय कर लेता है कि उसे किस Class के Overridden Method को Call करना है। इसलिए इस प्रक्रिया को Polymorphism कहा जाता है। Polymorphism की इस प्रक्रिया को हम निम्नानुसार Program द्वारा समझ सकते हैं:

// Program
// File Name: DynamicMethodDispatch.java
	class TopClass 
	{
		void callme()
		{
			System.out.println("callme Method Called from the TopClass");
		}
	}
	
	class MiddleClass extends TopClass
	{
		void callme() 					// Overridden callme() Method
		{
			System.out.println("callme Method Called from the MiddleClass");
		}
	}
	
	class BottomClass extends MiddleClass
	{
		void callme()					// Overridden callme() Method
		{
			System.out.println("callme Method Called from the BottomClass");
		}
	}
	
	class DynamicMethodDispatch
	{
		public static void main(String args[])
		{
			TopClass topObject = new TopClass(); 		// TopClass Object
			MiddleClass middleObject = new MiddleClass(); 	// MiddleClass Object
			BottomClass bottomObject = new BottomClass(); 	// BottomClass Object
	
			TopClass reference = new TopClass(); 		// TopClass Object
	
			reference = topObject; 	// reference Refers to TopClass Object
			reference.callme(); 		// Calls TopClass's callme() Overridden Method
	
			reference = middleObject; 	// reference Refers to MiddleClass Object
			reference.callme(); 		// Calls MiddleClass's callme() Overridden Method
	
			reference = bottomObject; 	// reference Refers to BottomClass Object
			reference.callme(); 		// Calls BottomClass's callme() Overridden Method
		}
	}

// Output 
   callme Method Called from the TopClass
   callme Method Called from the MiddleClass
   callme Method Called from the BottomClass

इस Program में हम देख सकते हैं निम्न Statement को Program में तीन बार Use किया गया है, लेकिन तीनों ही बार एक अलग callme() Method Execute हुआ है, जिन्हें हम Output में देख सकते हैं:

        reference.callme();

इस Statement से हर बार अलग Class का Overridden callme() Method इसलिए Execute हुआ है, क्योंकि हर बार इस Statement से पहले क्रम से निम्नानुसार एक Statement लिखकर Super Class के topObject को Sub Class के Object का Reference Assign किया गया है:

reference = topObject;      // reference Refers to TopClass Object
reference = middleObject;   // reference Refers to MiddleClass Object
reference = bottomObject;   // reference Refers to BottomClass Object

और चूंकि जावा Compiler उसी Object की Class के callme() Method को Call करता है, जिसकी Class के Object का Reference Super Class के Object reference में होता है। इसलिए हर बार reference.callme() Statement एक अलग Class के callme() Method को Call कर लेता है। “C++” में यही काम Virtual Functions करते हैं।

अब सवाल ये पैदा होता है कि जावा में इस Method Overridden Concept की जरूरत क्या है\ तो इसका जवाब ये है कि Method Overridden करने से हमें जावा में Run Time Polymorphism की सुविधा प्राप्त हो जाती है।

Polymorphism किसी भी Object Oriented Programming Language का एक बहुत ही महत्वपूर्ण हिस्सा होता है और हर Object Oriented Programming Language में Polymorphism का Support करना इसलिए जरूरी होता है, क्योंकि Polymorphism ये सुविधा देता है कि किसी General Class के जितने भी Methods उसकी सभी Derived या Sub Classes के लिए Common हो सकते हैं, उन सभी Methods को Super Class में Define किया जा सकता है।

Polymorphism द्वारा प्रदान की जाने वाली इस सुविधा के कारण हमें उन सभी कामों को करने के लिए जो कि किसी Super Class की सभी Sub Classes के लिए Common हों, हर Sub Class में अलग से Methods को Define करने की जरूरत नहीं रह जाती है, बल्कि सभी प्रकार की Sub Classes के लिए जो Common Methods होते हैं, उन्हें Super Class में ही Define कर लिया जाता है और जब भी किसी Sub Class में Super Class के उस Method को Access करने की जरूरत होती है, Polymorphism के Concept के आधार पर Super Class के Object में Sub Class के Object का Reference Assign करके Sub Class के Object के लिए Super Class के उस Common Method को Call कर लिया जाता है।

जावा में Polymorphism को Best तरीके से Apply करना इस समझ पर निर्भर करता है कि Super Class व Sub Class आपस में मिलकर एक प्रकार की Hierarchy Create करते हैं, जो कि Top Level से Lower Level की तरफ आते&आते General Classes से Specialized Classes में Convert होते चले जाते हैं।

यदि Super Class को अच्छी तरीके से Use किया जाए, तो एक Super Class उसकी सभी Sub Classes को ये सुविधा देता है कि वे Super Class के सभी Elements को Directly Access कर सकते हैं। Super Class में उन Methods को भी पहले से ही Define किया जा चुका होता है जिन्हें Derived Classes को Implement करना जरूरी होता है।

Polymorphism Sub Classes को ये Flexibility प्रदान करता है कि उनमें उनके खुद के Methods को Define किया जा सके। इस तरह से यदि हम सारांश देखें तो हम कह सकते हैं कि Inheritance को Overridden Methods के साथ Combine करके एक Super Class ऐसे Methods को Define कर सकता है, जिन्हें उस Super Class की सभी Classes Common रूप से उपयोग में लेने में सक्षम होती हैं।

Dynamic या Run Time Polymorphism Object Oriented Programming के Design का एक Most Powerful Mechanism है, जिसके कारण हम सुरिक्षत तरीके से एक बार Create किए गए Codes को बार-बार Reuse करने में सक्षम हो पाते हैं। OOPS द्वारा प्रदान की गई ये क्षमता जिससे नई Classes के Objects पहले से Exists Code Library के Methods को बिना Recompile किए हुए फिर से Call कर सकते हैं, Object Oriented Programming Design की एक Programmer को मिलने वाली एक बहुत ही जबरदस्त सुविधा है।

चलिए, Polymorphism का एक और उदाहरण देखते हैं, जिसमें Method Overriding का प्रयोग किया गया है। अगले Program में Figure नाम की एक Super Class है, जिसमें विभिन्न 2-D Objects के Dimension Store होते हैं। इसमें area() नाम का एक Method भी Define किया गया है, जो Object के Area को Calculate करता है। इस Program में इस Figure Class से दो Sub Classes RectangleTriangle Derive की गई हैं। ये दोनों Sub Classes Super Class के area() Method को Override करते हैं, ताकि ये Method क्रम से Rectangle व Triangle दोनों का Area Return कर सके।

// Program
// File Name: PolymorphismArea.java
	
	class Figure
	{
		double dim1, dim2;
	
		Figure(double dimension1, double dimension2)
		{
			dim1 = dimension1;
			dim2 = dimension2;
		}
		double area()
		{
			System.out.println("\nArea of Figure is undefined ");
			return 0;
		}
	}
	
	class Rectangle extends Figure
	{
		Rectangle(double dimension1, double dimension2)
		{
			super(dimension1, dimension2);
		}
		double area() 				// Override area() for Rectangle Class  
		{
			System.out.println("\nInside Area for Rectangle : ");
			return dim1 * dim2;
		}
	}
	
	class Triangle extends Figure
	{
		Triangle(double dimension1, double dimension2)
		{
			super(dimension1, dimension2);
		}
		double area() 				// Override area() for Right Triangle 
		{
			System.out.println("\nInside Area for Triangle : ");
			return dim1 * dim2 / 2;
		}
	}
	
	class PolymorphismArea
	{
		public static void main(String args[])
		{
			Figure newFigure = new Figure(10,10);
			Rectangle newRectangle = new Rectangle(6,7);
			Triangle newTriangle = new Triangle(12,23);
	
			Figure referenceFigure;
	
			referenceFigure = newRectangle;
			System.out.println("Area is " + referenceFigure.area());
	
			referenceFigure = newTriangle;
			System.out.println("Area is " + referenceFigure.area());
	
			referenceFigure = newFigure;
			System.out.println("Area is " + referenceFigure.area());
		}
	}

// Output 
   Inside Area for Rectangle :
      Area is 42.0

   Inside Area for Triangle :
      Area is 138.0

   Area of Figure is undefined
      Area is 0.0
Inheritance and Constructor - The Calling Convention
Abstract Class in Java

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