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

    public final class String {
    }
    
    class SubString extends String { // Compilation error
    }
मुझे यह भी ध्यान रखना चाहिए कि अंतिम संशोधक अमूर्त वर्गों (कीवर्ड सार वाले) पर लागू नहीं किया जा सकता है, क्योंकि ये परस्पर अनन्य अवधारणाएं हैं। अंतिम विधि के लिए, संशोधक का अर्थ है कि उपवर्गों में विधि को ओवरराइड नहीं किया जा सकता है। यह तब उपयोगी होता है जब हम मूल कार्यान्वयन में परिवर्तन को रोकना चाहते हैं।

    public class SuperClass {
        public final void printReport() {
            System.out.println("Report");
        }
    }

    class SubClass extends SuperClass { 
        public void printReport() { //Compilation error
            System.out.println("MyReport");
        }
    }
आदिम प्रकार के चर के लिए, अंतिम कीवर्ड का अर्थ है कि एक बार असाइन किए गए मान को बदला नहीं जा सकता है। संदर्भ चर के लिए, इसका मतलब है कि एक वस्तु सौंपे जाने के बाद, आप उस वस्तु के संदर्भ को नहीं बदल सकते। यह महत्वपूर्ण है! संदर्भ को बदला नहीं जा सकता, लेकिन वस्तु की स्थिति को बदला जा सकता है। जावा 8 ने एक नई अवधारणा पेश की: प्रभावी रूप से अंतिम। यह केवल चर (विधि पैरामीटर सहित) पर लागू होता है। लब्बोलुआब यह है कि अंतिम कीवर्ड की स्पष्ट अनुपस्थिति के बावजूद, आरंभीकरण के बाद चर का मान नहीं बदलता है। दूसरे शब्दों में, अंतिम कीवर्ड को ऐसे चर पर संकलन त्रुटि के बिना लागू किया जा सकता है। स्थानीय कक्षाओं (स्थानीय आंतरिक कक्षाओं), अज्ञात कक्षाओं (अनाम आंतरिक कक्षाओं), और धाराओं (स्ट्रीम एपीआई) के अंदर प्रभावी रूप से अंतिम चर का उपयोग किया जा सकता है।

        public void someMethod() {
            // In the example below, both a and b are effectively final, since they are assigned values only once:
            int a = 1;
            int b;
            if (a == 2) b = 3;
            else b = 4;
            // c is NOT effectively final since its value changes
            int c = 10;
            c++;
            
            Stream.of(1, 2).forEach(s-> System.out.println(s + a)); // OK
            Stream.of(1, 2).forEach(s-> System.out.println(s + c)); // Compilation error
        }
अब थोड़ा साक्षात्कार करते हैं। आख़िरकार, CodeGym पाठ्यक्रम को पूरा करने का लक्ष्य एक जावा डेवलपर बनना और एक दिलचस्प और अच्छे वेतन वाली नौकरी खोजना है। तो चलिए शुरू करते हैं।
  1. अंतिम घोषित की गई सरणी के बारे में हम क्या कह सकते हैं?

  2. हम जानते हैं कि स्ट्रिंग वर्ग अपरिवर्तनीय है: वर्ग को अंतिम घोषित किया जाता है। एक स्ट्रिंग मान एक चार सरणी में संग्रहीत होता है जिसे कीवर्ड फ़ाइनल के साथ चिह्नित किया जाता है।


public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

क्या हम स्ट्रिंग ऑब्जेक्ट के मान को बदल सकते हैं (ऑब्जेक्ट के संदर्भ को बदले बिना)? ये वास्तविक साक्षात्कार प्रश्न हैं। और अभ्यास से पता चलता है कि कई उम्मीदवार उनका सही उत्तर नहीं देते हैं। यह समझना कि अंतिम कीवर्ड का उपयोग कैसे किया जाता है, विशेष रूप से संदर्भ चर के लिए, यह बहुत महत्वपूर्ण है। जैसा कि आप इस पर विचार करते हैं, मैं CodeGym टीम से एक छोटा सा अनुरोध करूंगा। कृपया टेक्स्ट एडिटर को एक ब्लॉक जोड़ने की क्षमता दें जिसकी सामग्री को क्लिक करने पर दिखाया/छिपाया जा सकता है। उत्तर:
  1. एक सरणी एक वस्तु है, इसलिए अंतिम कीवर्ड का अर्थ है कि एक बार सरणी के संदर्भ को निर्दिष्ट करने के बाद, संदर्भ को बदला नहीं जा सकता। उस ने कहा, आप वस्तु की स्थिति बदल सकते हैं।

    
            final int[] array = {1, 2, 3, 4, 5};
            array[0] = 9;	 // OK, because we're changing the contents of the array: {9, 2, 3, 4, 5}
            array = new int[5]; // Compilation error
    
  2. हाँ हम कर सकते हैं। मुख्य बात यह समझना है कि वस्तुओं के साथ उपयोग किए जाने पर कांटेदार अंतिम कीवर्ड का क्या अर्थ है। प्रतिबिंब एपीआई का उपयोग मूल्यों को बदलने के लिए किया जा सकता है।


import java.lang.reflect.Field;

class B {
    public static void main(String[] args) throws Exception {
        String value = "Old value";
        System.out.println(value);

        // Get the String class's value field
        Field field = value.getClass().getDeclaredField("value");
        // Make it mutable
        field.setAccessible(true);
        // Set a new value
        field.set(value, "CodeGym".toCharArray());

        System.out.println(value);

        /* Output:
         * Old value
         * CodeGym
         */
    }
}
कृपया ध्यान दें कि यदि हमने इस तरह से एक आदिम प्रकार के अंतिम चर को बदलने की कोशिश की होती, तो कुछ नहीं होता। मेरा सुझाव है कि आप अपने आप को विश्वास दिलाएं: एक जावा क्लास बनाएं, उदाहरण के लिए, अंतिम इंट फ़ील्ड के साथ और रिफ्लेक्शन एपीआई का उपयोग करके इसके मूल्य को बदलने का प्रयास करें। सभी को धन्यवाद!