जावा में "अंतिम वर्ग" का क्या मतलब है?


569

मैं जावा के बारे में एक पुस्तक पढ़ रहा हूं और यह कहता है कि आप पूरी कक्षा को इस रूप में घोषित कर सकते हैं final। मैं इस बारे में कुछ नहीं सोच सकता कि मैं इसका उपयोग कहां करूंगा।

मैं प्रोग्रामिंग में नया हूं और मुझे आश्चर्य हो रहा है कि क्या प्रोग्रामर वास्तव में अपने कार्यक्रमों में इसका उपयोग करते हैं । यदि वे करते हैं, तो वे इसका उपयोग कब करते हैं तो मैं इसे बेहतर तरीके से समझ सकता हूं और जान सकता हूं कि इसका उपयोग कब करना है।

यदि जावा ऑब्जेक्ट ओरिएंटेड है, और आप एक क्लास की घोषणा करते हैं final, तो क्या यह ऑब्जेक्ट की विशेषताओं वाले क्लास के विचार को रोक नहीं सकता है?

जवाबों:


531

सबसे पहले, मैं इस लेख की सलाह देता हूं: जावा: जब एक अंतिम वर्ग बनाना है


यदि वे करते हैं, तो वे इसका उपयोग कब करते हैं तो मैं इसे बेहतर तरीके से समझ सकता हूं और जान सकता हूं कि इसका उपयोग कब करना है।

एक finalवर्ग बस एक वर्ग है जिसे बढ़ाया नहीं जा सकता है

(इसका मतलब यह नहीं है कि वर्ग की वस्तुओं के सभी संदर्भ इस तरह कार्य करेंगे जैसे कि उन्हें घोषित किया गया हो final।)

जब वर्ग को अंतिम घोषित करना उपयोगी होता है, तो इस प्रश्न के उत्तर में कवर किया जाता है:

यदि जावा ऑब्जेक्ट ओरिएंटेड है, और आप एक क्लास की घोषणा करते हैं final, तो क्या यह ऑब्जेक्ट की विशेषताओं वाले क्लास के विचार को रोक नहीं सकता है?

कुछ मायने में हाँ।

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


39
उत्तर में जोड़ने के लिए, प्रभावी जावा के सिद्धांतों में से एक विरासत पर रचना का पक्ष लेना है। अंतिम कीवर्ड का उपयोग उस सिद्धांत को लागू करने में भी मदद करता है।
रिग्गी

9
"आप इसे मुख्य रूप से दक्षता और सुरक्षा कारणों से करते हैं।" मैं इस टिप्पणी को बहुत बार सुनता हूं (यहां तक ​​कि विकिपीडिया यह भी बताता है) लेकिन मैं अभी भी इस तर्क के पीछे के तर्क को नहीं समझता हूं। क्या कोई यह बताने के लिए परवाह करता है कि कैसे, एक गैर-अंतिम java.lang.String ने अयोग्य या असुरक्षित समाप्त कर दिया है?
MRA

27
@ एमआरए यदि मैं एक ऐसी विधि बनाता हूं जो स्ट्रिंग को एक पैरामीटर के रूप में स्वीकार करता है, तो मुझे लगता है कि यह अपरिवर्तनीय है, क्योंकि स्ट्रिंग्स हैं। इसके परिणामस्वरूप, मुझे पता है कि मैं स्ट्रिंग ऑब्जेक्ट पर किसी भी विधि को सुरक्षित रूप से कॉल कर सकता हूं, और पारित स्ट्रिंग को नहीं बदल सकता। यदि मैं स्ट्रिंग का विस्तार करने के लिए था, और वास्तविक स्ट्रिंग को बदलने के लिए प्रतिस्थापन के कार्यान्वयन को बदलना था, तो जिस स्ट्रिंग ऑब्जेक्ट से आपको अपरिवर्तनीय होने की उम्मीद थी वह अब अपरिवर्तनीय नहीं है।
क्रंचर

1
@Sortofabeginner और जैसे ही आप कहते हैं कि आप चाहते हैं कि सभी स्ट्रिंग विधियां और फ़ील्ड अंतिम हों, बस ताकि आप अतिरिक्त कार्यक्षमता के साथ कुछ वर्ग बना सकें ... उस बिंदु पर आप केवल एक वर्ग बना सकते हैं जिसमें एक स्ट्रिंग है और उस स्ट्रिंग पर काम करने वाले तरीके बनाएँ।
क्रंचर

1
@ सहाय अंतिम (अन्य चीजों के बीच) का उपयोग किसी वस्तु को अपरिवर्तनीय बनाने के लिए किया जाता है, इसलिए मैं यह नहीं कहूंगा कि उनका एक-दूसरे से कोई लेना-देना नहीं है। यहाँ देखें docs.oracle.com/javase/tutorial/essential/concurrency/...
Celeritas

184

जावा में, finalसंशोधक वाले आइटम नहीं बदले जा सकते हैं!

इसमें अंतिम वर्ग, अंतिम चर और अंतिम विधियाँ शामिल हैं:

  • एक अंतिम वर्ग को किसी अन्य वर्ग द्वारा विस्तारित नहीं किया जा सकता है
  • एक अंतिम चर दूसरे मान को पुन: असाइन नहीं किया जा सकता है
  • एक अंतिम विधि ओवरराइड नहीं की जा सकती

40
वास्तविक सवाल यह है कि क्यों , नहीं क्या
फ्रांसेस्को मेंजानी

8
बयान में, "जावा में, finalसंशोधक वाली वस्तुओं को नहीं बदला जा सकता है!", बहुत स्पष्ट है और वास्तव में, पूरी तरह से सही नहीं है। जैसा कि ग्रैडी बूच ने कहा, "एक वस्तु की स्थिति, व्यवहार और पहचान है"। जब हम एक वस्तु की पहचान को बदल नहीं सकते हैं, क्योंकि इसके संदर्भ को अंतिम रूप में चिह्नित किया गया है, तो हमारे पास इसके गैर- क्षेत्रों में नए मान निर्दिष्ट करके इसका राज्य बदलने का मौका है final(बशर्ते, यह उनके पास है।) कोई भी जो कोई भी हो। ओरेकल जावा प्रमाणन प्राप्त करने की योजना (जैसे 1Z0-808, आदि) को इसे ध्यान में रखना चाहिए क्योंकि परीक्षा पर इस पहलू पर सवाल हो सकते हैं ...
इगोर सौडेकेविच

33

एक परिदृश्य जहां अंतिम महत्वपूर्ण है, जब आप सुरक्षा कारणों से एक वर्ग की विरासत को रोकना चाहते हैं । यह आपको यह सुनिश्चित करने की अनुमति देता है कि आपके द्वारा चलाए जा रहे कोड को किसी के द्वारा ओवरराइड नहीं किया जा सकता है

एक अन्य परिदृश्य अनुकूलन के लिए है: मुझे याद है कि जावा कंपाइलर अंतिम कक्षाओं से कुछ फ़ंक्शन कॉल को इनलाइन करता है। इसलिए, यदि आप कॉल करते हैं a.x()और एक घोषित किया जाता है final, तो हम संकलन-समय पर जानते हैं कि कोड क्या होगा और कॉलिंग फ़ंक्शन में इनलाइन कर सकता है। मुझे नहीं पता कि क्या वास्तव में ऐसा किया गया है, लेकिन अंतिम रूप से यह एक संभावना है।


7
इनलाइनिंग आमतौर पर रनटाइम के समय-समय पर संकलक द्वारा ही की जाती है। यह अंतिम के बिना भी काम करता है, लेकिन जेआईटी-कंपाइलर के पास यह सुनिश्चित करने के लिए थोड़ा अधिक काम है कि कोई फैली हुई कक्षाएं नहीं हैं (या कि ये फैली हुई कक्षाएं इस पद्धति को नहीं छूती हैं)।
पाओलो एबरमैन

इनलाइनिंग और ऑप्टिमाइज़ेशन के मुद्दे पर एक अच्छा लेखन यहाँ पाया जा सकता है: lemire.me/blog/archives/2014/12/17/…
जोश हेमन

24

सबसे अच्छा उदाहरण है

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

जो एक अपरिवर्तनीय वर्ग है और इसे बढ़ाया नहीं जा सकता है। बेशक, कक्षा को अंतिम रूप देने के लिए अपरिवर्तनीय होने के अलावा और भी बहुत कुछ है।


हेह, कभी-कभी यह खुद से रुब गॉलेजफ़ायर डेवलपर्स की रक्षा करता है।
ज़ोएडबर्ग

16

प्रासंगिक रीडिंग: बॉब मार्टिन द्वारा ओपन-क्लोज्ड सिद्धांत

मुख्य उद्धरण:

सॉफ्टवेयर एंटिटीज (कक्षाएं, मॉड्यूल, कार्य, आदि) एक्सटेंशन के लिए खुली होनी चाहिए, लेकिन संशोधन के लिए बंद।

finalकीवर्ड साधन जावा में इस लागू करने के लिए, चाहे वह तरीकों पर या वर्गों पर उपयोग की गई है।


6
@ सीन: इसे घोषित नहीं करने finalसे वर्ग को खुले के बजाय विस्तार के लिए बंद कर दिया गया है? या मैं इसे सचमुच में ले रहा हूं?
गोरान जोविच

4
@ विश्व स्तर पर अंतिम रूप से आवेदन करना, हाँ। कुंजी उन स्थानों पर चुनिंदा रूप से अंतिम रूप से लागू करने की है जहां आप संशोधन नहीं करना चाहते हैं (और विस्तार के लिए अच्छे हुक प्रदान करने के लिए)
शॉन पैट्रिक फ्लॉयड

26
OCP में, "संशोधन" स्रोत कोड को संशोधित करने के लिए संदर्भित करता है, और "विस्तार" कार्यान्वयन विरासत को संदर्भित करता है। इसलिए, finalयदि आप संशोधन के लिए कार्यान्वयन कोड को बंद करना चाहते हैं, लेकिन इनहेरिटेंस द्वारा विस्तार के लिए खुला होना चाहते हैं, तो क्लास / मेथड डिक्लेरेशन के उपयोग का कोई मतलब नहीं होगा।
रोजेय

1
@Rogerio मैंने स्प्रिंग फ्रेमवर्क संदर्भ (MVC) से संदर्भ (और व्याख्या) उधार लिया है । IMHO यह मूल संस्करण की तुलना में बहुत अधिक समझ में आता है।
शॉन पैट्रिक फ्लोयड

एक्सटेंशन मर चुका है। निकम्मा। नाश कर दिया। नष्ट हो गए। मुझे OCP की कोई परवाह नहीं है। एक वर्ग का विस्तार करने का बहाना कभी नहीं है।
जोश वुडकॉक

15

यदि आप श्रेणी के पदानुक्रम को एक पेड़ के रूप में कल्पना करते हैं (जैसा कि यह जावा में है), अमूर्त वर्ग केवल शाखाएं हो सकती हैं और अंतिम वर्ग वे होते हैं जो केवल छलांग हो सकते हैं। वर्ग जो उन श्रेणियों में से किसी में भी नहीं आते हैं, वे शाखाएं और छलांग दोनों हो सकते हैं।

यहां ओओ सिद्धांतों का कोई उल्लंघन नहीं है, फाइनल बस एक अच्छा समरूपता प्रदान कर रहा है।

व्यवहार में आप अंतिम उपयोग करना चाहते हैं यदि आप चाहते हैं कि आपकी वस्तुएं अपरिवर्तनीय हैं या यदि आप एपीआई लिख रहे हैं, तो एपीआई के उपयोगकर्ताओं को यह संकेत देने के लिए कि वर्ग सिर्फ विस्तार के लिए अभिप्रेत नहीं है।


13

कीवर्ड का finalअर्थ है कि कुछ अंतिम है और इसे किसी भी तरह से संशोधित नहीं किया जाना चाहिए। यदि एक वर्ग को चिह्नित किया जाता है finalतो उसे बढ़ाया या उप- वर्ग नहीं किया जा सकता है। लेकिन सवाल यह है कि हम एक वर्ग को क्यों चिह्नित करते हैं final? IMO के विभिन्न कारण हैं:

  1. मानकीकरण: कुछ वर्ग मानक कार्य करते हैं और उन्हें संशोधित करने के लिए नहीं किया जाता है जैसे कि स्ट्रिंग हेरफेर या गणितीय कार्यों आदि से संबंधित विभिन्न कार्य करने वाली कक्षाएं।
  2. सुरक्षा कारण : कभी-कभी हम ऐसी कक्षाएं लिखते हैं जो विभिन्न प्रमाणीकरण और पासवर्ड संबंधित कार्य करते हैं और हम नहीं चाहते कि उन्हें किसी और द्वारा बदल दिया जाए।

मैंने सुना है कि अंकन वर्ग finalदक्षता में सुधार करता है, लेकिन स्पष्ट रूप से मैं इस तर्क को ज्यादा वजन नहीं उठा सका।

यदि जावा ऑब्जेक्ट ओरिएंटेड है, और आप एक क्लास फाइनल घोषित करते हैं, तो क्या यह क्लास के विचार को वस्तुओं की विशेषताओं को रोक नहीं सकता है?

शायद हाँ, लेकिन कभी-कभी यही उद्देश्य होता है। कभी-कभी हम ऐसा करते हैं कि इस वर्ग की क्षमता को बढ़ाकर सुरक्षा आदि का बड़ा लाभ हासिल किया जा सके। लेकिन एक अंतिम वर्ग अभी भी एक वर्ग का विस्तार कर सकता है अगर इसे करने की आवश्यकता है।

एक ओर ध्यान दें कि हमें वंशानुक्रम पर रचना पसंद करनी चाहिए और finalखोजशब्द वास्तव में इस सिद्धांत को लागू करने में मदद करता है।


6

जब आप "फाइनल" क्लास करें तो सावधान रहें। क्योंकि यदि आप एक अंतिम वर्ग के लिए एक इकाई परीक्षण लिखना चाहते हैं, तो आप माइकल सी। पंख की पुस्तक "वर्किंग इफेक्टिवली विथ लिगेसी कोड" में वर्णित निर्भरता-ब्रेकिंग तकनीक "सबक्लास एंड ओवरराइड मेथड" का उपयोग करने के लिए इस अंतिम वर्ग को उपवर्ग में नहीं डाल सकते हैं। । इस पुस्तक में, पंख ने कहा, "गंभीरता से, यह मानना ​​आसान है कि सील और अंतिम एक गलत-अध्यक्षता वाली गलती है, कि उन्हें कभी भी प्रोग्रामिंग भाषाओं में नहीं जोड़ा जाना चाहिए। लेकिन असली दोष हमारे साथ है। जब हम सीधे निर्भर करते हैं। पुस्तकालय जो हमारे नियंत्रण से बाहर हैं, हम सिर्फ परेशानी पूछ रहे हैं। ''


6

final class जब आप नए तरीके जोड़ते हैं तो सार्वजनिक एपीआई को तोड़ने से बच सकते हैं

मान लीजिए कि Baseआप अपनी कक्षा के संस्करण 1 पर हैं:

public class Base {}

और एक ग्राहक करता है:

class Derived extends Base {
    public int method() { return 1; }
}

फिर अगर संस्करण 2 में आप एक methodविधि जोड़ना चाहते हैं Base:

class Base {
    public String method() { return null; }
}

यह क्लाइंट कोड को तोड़ देगा।

यदि हमने final class Baseइसके बजाय उपयोग किया होता, तो क्लाइंट इनहेरिट करने में सक्षम नहीं होता, और पद्धति जोड़ API को तोड़ नहीं पाती।


5

यदि वर्ग को चिह्नित किया जाता है final, तो इसका मतलब है कि वर्ग की संरचना को किसी भी बाहरी चीज द्वारा संशोधित नहीं किया जा सकता है। जहां यह सबसे अधिक दिखाई देता है, जब आप पारंपरिक बहुरूपता विरासत में कर रहे हैं, तो मूल रूप से class B extends Aसिर्फ काम नहीं करेगा। यह मूल रूप से आपके कोड के कुछ हिस्सों (हद तक) की रक्षा करने का एक तरीका है ।

स्पष्ट करने के लिए, अंकन वर्ग finalअपने क्षेत्रों को चिह्नित नहीं करता है finalऔर इस तरह से वस्तु गुणों की रक्षा नहीं करता है, बल्कि वास्तविक वर्ग संरचना है।


1
वस्तु गुणों का क्या अर्थ है? क्या इसका मतलब है कि अगर कक्षा को अंतिम घोषित किया जाता है तो मैं कक्षा के सदस्य चर को संशोधित कर सकता हूं? तो अंतिम वर्ग का एकमात्र उद्देश्य विरासत को रोकना है।
एडम ल्यू

5

अंतिम चरण समस्या का पता लगाने के लिए:

क्लास फाइनल करने के दो तरीके हैं। कक्षा घोषणा में कीवर्ड फाइनल का उपयोग करने के लिए सबसे पहले है:

public final class SomeClass {
  //  . . . Class contents
}

एक वर्ग फाइनल बनाने का दूसरा तरीका अपने सभी कंस्ट्रक्टरों को निजी घोषित करना है:

public class SomeClass {
  public final static SOME_INSTANCE = new SomeClass(5);
  private SomeClass(final int value) {
  }

इसे अंतिम रूप देने से आपको परेशानी का सामना करना पड़ता है, अगर यह पता लगाया जाए कि यह एक वास्तविक है, तो इस टेस्ट क्लास को देखने के लिए। पहली नज़र में सार्वजनिक दिखता है।

public class Test{
  private Test(Class beanClass, Class stopClass, int flags)
    throws Exception{
    //  . . . snip . . . 
  }
}

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

इसलिए आपको इसे अंतिम रूप से तब चिन्हित करना चाहिए जब आप इसे निर्माणकर्ता को निजी बनाकर एक वर्ग का अंतिम रूप दें।


4

एक अंतिम वर्ग एक ऐसा वर्ग है जिसे बढ़ाया नहीं जा सकता है। इसके अलावा तरीकों को अंतिम रूप में यह घोषित करने के लिए घोषित किया जा सकता है कि उपवर्गों द्वारा ओवरराइड नहीं किया जा सकता है।

वर्ग को उपवर्गित होने से रोकना विशेष रूप से उपयोगी हो सकता है यदि आप एपीआई या लाइब्रेरी लिखते हैं और व्यवहार को बदलने के लिए विस्तारित होने से बचना चाहते हैं।


4

एक वर्ग को अंतिम रूप देने का एक फायदा: -

स्ट्रिंग क्लास को अंतिम रखा जाता है ताकि कोई भी इसके तरीकों को ओवरराइड न कर सके और कार्यक्षमता को बदल सके। उदाहरण के लिए कोई भी लंबाई () विधि की कार्यक्षमता को नहीं बदल सकता है। यह हमेशा एक स्ट्रिंग की लंबाई लौटाएगा।

इस वर्ग के डेवलपर इस वर्ग की कार्यक्षमता को बदलना नहीं चाहते थे, इसलिए उन्होंने इसे अंतिम रूप दिया।


3

हां, कभी-कभी आप ऐसा चाहते हो सकते हैं, सुरक्षा या गति कारणों से। यह C ++ में भी किया जाता है। यह कार्यक्रमों के लिए लागू नहीं हो सकता है , लेकिन रूपरेखा के लिए मोरसो। http://www.glenmccl.com/perfj_025.htm


3

जावा अंतिम कीवर्ड में नीचे के अवसरों के लिए उपयोग किया जाता है।

  1. अंतिम चर
  2. अंतिम तरीके
  3. फाइनल क्लासेस

जावा अंतिम चर में पुन: असाइन नहीं किया जा सकता है, अंतिम कक्षाएं विस्तारित नहीं हो सकती हैं और अंतिम विधियां ओवरराइड नहीं कर सकती हैं।


1

अंतिम कक्षाओं का विस्तार नहीं किया जा सकता है। इसलिए यदि आप एक निश्चित तरीके का व्यवहार करना चाहते हैं और किसी को तरीकों को ओवरराइड नहीं करना चाहते हैं (संभवतः कम कुशल और अधिक दुर्भावनापूर्ण कोड के साथ), तो आप पूरी कक्षा को अंतिम या विशिष्ट तरीकों के रूप में घोषित कर सकते हैं जो आप नहीं चाहते हैं बदला हुआ।

चूँकि वर्ग घोषित करना किसी वर्ग को तात्कालिक होने से नहीं रोकता है, इसका मतलब यह नहीं है कि वह किसी वस्तु की विशेषताओं को होने से रोक देगा। यह सिर्फ इतना है कि आपको उन तरीकों से चिपकना होगा जिस तरह से वे कक्षा में घोषित किए जाते हैं।


1

"लाइन के अंत" के रूप में फाइनल के बारे में सोचो - वह आदमी अब संतान पैदा नहीं कर सकता। इसलिए जब आप इसे इस तरह से देखते हैं, तो वास्तविक विश्व परिदृश्यों के टन होते हैं जो आपको उस पार आएंगे जो आपको क्लास के लिए 'लाइन ऑफ लाइन' मार्कर को फ्लैग करने की आवश्यकता होती है। यह डोमेन ड्रिवेन डिज़ाइन है - यदि आपका डोमेन मांग करता है कि एक दी गई ईएनटीआईटी (क्लास) सब-क्लास नहीं बना सकती है, तो इसे अंतिम के रूप में चिह्नित करें।

मुझे ध्यान देना चाहिए कि आपको "अंतिम रूप में चिह्नित किया जाना चाहिए" वर्ग विरासत में मिलने से कुछ भी नहीं है। लेकिन इसे आम तौर पर "विरासत के दुरुपयोग" के रूप में वर्गीकृत किया जाता है, और ऐसा इसलिए किया जाता है क्योंकि अक्सर आप अपनी कक्षा में आधार फ़ंक्शन से कुछ फ़ंक्शन प्राप्त करना चाहते हैं।

सबसे अच्छा तरीका डोमेन को देखना है और इसे अपने डिजाइन निर्णयों को निर्धारित करने देना है।


1

जैसा कि ऊपर कहा गया है, यदि आप चाहते हैं कि कोई भी विधि की कार्यक्षमता को बदल नहीं सकता है तो आप इसे अंतिम रूप में घोषित कर सकते हैं।

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


1

Android Looper वर्ग इसका एक अच्छा व्यावहारिक उदाहरण है। http://developer.android.com/reference/android/os/Looper.html

लूपर वर्ग कुछ निश्चित कार्यक्षमता प्रदान करता है जो किसी अन्य वर्ग द्वारा अतिरंजित होने का इरादा नहीं है। इसलिए, यहां कोई उप-वर्ग नहीं है।


1

मान लीजिए कि आपके पास एक Employeeवर्ग है जो एक विधि है greet। जब greetविधि कहा जाता है तो यह केवल प्रिंट करता है Hello everyone!। तो यह विधि का अपेक्षित व्यवहार हैgreet

public class Employee {

    void greet() {
        System.out.println("Hello everyone!");
    }
}

अब, GrumpyEmployeeउपक्लास Employeeऔर ओवरराइड greetविधि को नीचे दिखाए अनुसार करें।

public class GrumpyEmployee extends Employee {

    @Override
    void greet() {
        System.out.println("Get lost!");
    }
}

अब नीचे दिए गए कोड में sayHelloविधि पर एक नज़र है । यह Employeeएक पैरामीटर के रूप में उदाहरण लेता है और ग्रीटिंग विधि को यह कहते हुए उम्मीद करता है कि यह कहेगा Hello everyone!लेकिन हमें जो मिलता है Get lost!। व्यवहार में यह परिवर्तन इस वजह से हैEmployee grumpyEmployee = new GrumpyEmployee();

public class TestFinal {
    static Employee grumpyEmployee = new GrumpyEmployee();

    public static void main(String[] args) {
        TestFinal testFinal = new TestFinal();
        testFinal.sayHello(grumpyEmployee);
    }

    private void sayHello(Employee employee) {
        employee.greet(); //Here you would expect a warm greeting, but what you get is "Get lost!"
    }
}

अगर क्लास की गई तो इस स्थिति से बचा जा सकता Employeeहै final। जरा सोचिए अराजकता की मात्रा एक चुटीले प्रोग्रामर का कारण बन सकती है यदि Stringक्लास को घोषित नहीं किया गया था final


1

अंतिम वर्ग को आगे नहीं बढ़ाया जा सकता है। यदि हमें जावा में एक वर्ग को अंतर्निहित करने की आवश्यकता नहीं है, तो हम इस दृष्टिकोण का उपयोग कर सकते हैं।

यदि हमें किसी वर्ग में विशेष तरीकों को ओवरराइड नहीं करने की आवश्यकता है, तो हम केवल उनके सामने अंतिम कीवर्ड डाल सकते हैं। वहां वर्ग अभी भी अंतर्निहित है।


-1

ऑब्जेक्ट ओरिएंटेशन वंशानुक्रम के बारे में नहीं है, यह एनकैप्सुलेशन के बारे में है। और वंशानुक्रम का अतिक्रमण टूट जाता है।

क्लास फाइनल घोषित करने से कई मामलों में सही समझ आती है। रंग या राशि की तरह "मूल्य" का प्रतिनिधित्व करने वाली कोई भी वस्तु अंतिम हो सकती है। वे अपने दम पर खड़े हैं।

यदि आप पुस्तकालयों को लिख रहे हैं, तो अपनी कक्षाओं को तब तक अंतिम रूप दें जब तक आप स्पष्ट रूप से उन्हें प्राप्त करने के लिए संकेत न दें। अन्यथा, लोग आपकी मान्यताओं / आक्रमणकारियों को तोड़ते हुए, आपकी कक्षाओं को प्राप्त कर सकते हैं और तरीकों को ओवरराइड कर सकते हैं। इसके साथ सुरक्षा निहितार्थ भी हो सकते हैं।

"प्रभावी जावा" में यहोशू बलोच वंशानुक्रम के लिए स्पष्ट रूप से डिजाइन करने या इसे प्रतिबंधित करने की सिफारिश करता है और वह नोट करता है कि विरासत के लिए डिजाइन करना इतना आसान नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.