जावा में इनहेरिटेंस के साथ कीवर्ड फाइनल का उपयोग करना

जबकि एक जावा के ताकत विरासत की अवधारणा है, जिसमें एक कक्षा दूसरे से प्राप्त कर सकते हैं, कभी-कभी यह एक अन्य वर्ग द्वारा विरासत को रोकने के लिए वांछनीय है। वंशानुक्रम को रोकने के लिए, क्लास बनाते समय "फाइनल" कीवर्ड का उपयोग करें।

उदाहरण के लिए, यदि किसी प्रोग्राम को अन्य प्रोग्रामर द्वारा उपयोग किए जाने की संभावना है, तो आप वंशानुक्रम को रोकने की इच्छा कर सकते हैं यदि कोई उपवर्ग बनाए गए तो समस्या हो सकती है। एक विशिष्ट उदाहरण है स्ट्रिंग क्लास. यदि हम एक स्ट्रिंग उपवर्ग बनाना चाहते हैं:

सार्वजनिक वर्ग MyString स्ट्रिंग का विस्तार करता है {
}

हमें इस त्रुटि का सामना करना पड़ेगा:

 अंतिम java.lang से विरासत में नहीं मिल सकता है। तार 

स्ट्रिंग क्लास के डिजाइनरों ने महसूस किया कि यह विरासत का उम्मीदवार नहीं था और इसे आगे बढ़ने से रोका है।

रोकथाम क्यों रोकें?

रोकथाम का मुख्य कारण विरासत यह सुनिश्चित करना है कि जिस तरह से वर्ग व्यवहार करता है वह एक उपवर्ग द्वारा भ्रष्ट नहीं है।

मान लीजिए हमारे पास एक वर्ग खाता और एक उपवर्ग है जो इसे विस्तारित करता है, ओवरड्राफ्टअकाउंट। क्लास खाते में एक विधि getBalance () है:

instagram viewer
 सार्वजनिक डबल गेटबालेंस ()

{

 इसे वापस करो। असंतुलन;

 } 

हमारी चर्चा में इस बिंदु पर, उपवर्ग ओवरड्राफ्टअकाउंट ने इस पद्धति को ओवरराइड नहीं किया है।

(ध्यान दें: इस खाते और ओवरड्राफ्टअकाउंट कक्षाओं का उपयोग करते हुए एक और चर्चा के लिए, देखें कि कैसे उपवर्ग को सुपरक्लास के रूप में माना जा सकता है).

आइए प्रत्येक खाता और ओवरड्राफ्टअकेाउंट कक्षाओं में एक उदाहरण बनाएं:

 खाता bobsAccount = नया खाता (10);

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = नया ओवरड्राफ्टAccount (15.05,500,0.05);

 jimsAccount.depositMoney (50);

 // खाता ऑब्जेक्ट की एक सरणी बनाएँ

 // हम jimsAccount को शामिल कर सकते हैं क्योंकि हम 

 // केवल इसे एक खाता वस्तु के रूप में मानना ​​चाहते हैं

 खाता [] खाते = {bobsAccount, jimsAccount};


 // सरणी में प्रत्येक खाते के लिए, शेष राशि प्रदर्शित करें

 के लिए (खाता: खाता)

 {

 System.out.printf ("शेष% .2f% n" है, a.getBalance ());

 }

 आउटपुट है:

 शेष राशि 60.00 है

 शेष राशि 65.05 है 

सब कुछ उम्मीद के मुताबिक काम करता है। लेकिन क्या होगा अगर OverdraftAccount विधि getBalance () को ओवरराइड करता है? ऐसा कुछ करने से रोकने के लिए कुछ भी नहीं है:

 सार्वजनिक वर्ग OverdraftAccount खाता बढ़ाता है {


 निजी डबल ओवरड्राफ्टलिमिट;

 निजी डबल ओवरड्राफ्टफाइ;


 // कक्षा की बाकी परिभाषा शामिल नहीं है


 सार्वजनिक डबल गेटबालेंस ()

 {

 वापसी 25.00;

 }

 } 

यदि ऊपर दिए गए उदाहरण कोड को फिर से निष्पादित किया जाता है, तो आउटपुट अलग होगा क्योंकि ओवरड्राफ्टअकाउंट वर्ग में thegetBalance () व्यवहार jimsAccount के लिए कहा जाता है:

 आउटपुट है:

 शेष राशि 60.00 है

 शेष राशि 25.00 है 

दुर्भाग्य से, उपवर्ग ओवरड्राफ्ट ओवरकाउंट करेगा कभी नहीँ सही संतुलन प्रदान करें क्योंकि हमने विरासत के माध्यम से खाता वर्ग के व्यवहार को दूषित कर दिया है।

यदि आप अन्य प्रोग्रामर द्वारा उपयोग किए जाने वाले वर्ग को डिज़ाइन करते हैं, तो हमेशा किसी भी संभावित उपवर्ग के निहितार्थ पर विचार करें। यही कारण है कि स्ट्रिंग वर्ग को बढ़ाया नहीं जा सकता है। यह अत्यंत महत्वपूर्ण है कि प्रोग्रामर जानते हैं कि जब वे एक स्ट्रिंग ऑब्जेक्ट बनाते हैं, तो यह हमेशा एक स्ट्रिंग की तरह व्यवहार करने वाला होता है।

वंशानुक्रम को कैसे रोकें

किसी वर्ग को विस्तारित होने से रोकने के लिए, कक्षा की घोषणा को स्पष्ट रूप से यह कहना होगा कि उसे विरासत में नहीं दिया जा सकता है। यह "अंतिम" कीवर्ड का उपयोग करके हासिल किया गया है:

 सार्वजनिक अंतिम वर्ग खाता {


 } 

इसका मतलब यह है कि खाता वर्ग सुपरक्लास नहीं हो सकता है, और ओवरड्राफ्टअकाउंट क्लास अब इसका उपवर्ग नहीं हो सकता है।

कभी-कभी, आप एक उपवर्ग द्वारा भ्रष्टाचार से बचने के लिए एक सुपरक्लास के केवल कुछ व्यवहार को सीमित करना चाह सकते हैं। उदाहरण के लिए, OverdraftAccount अभी भी खाते का एक उपवर्ग हो सकता है, लेकिन इसे GetBalance () विधि को ओवरराइड करने से रोका जाना चाहिए।

इस स्थिति में, विधि घोषणा में "अंतिम" कीवर्ड:

 पब्लिक क्लास अकाउंट {


 निजी डबल बैलेंस;


 // कक्षा की बाकी परिभाषा शामिल नहीं है


 सार्वजनिक अंतिम डबल getBalance ()

 {

 इसे वापस करो। असंतुलन;

 } 

 } 

ध्यान दें कि वर्ग परिभाषा में अंतिम कीवर्ड का उपयोग कैसे नहीं किया जाता है। खाते के उपवर्ग बनाए जा सकते हैं, लेकिन वे अब GetBalance () विधि को ओवरराइड नहीं कर सकते हैं। उस पद्धति को कॉल करने वाला कोई भी कोड आश्वस्त हो सकता है यह मूल प्रोग्रामर के रूप में काम करेगा।

instagram story viewer