Java हा कीवर्ड आहे — अंतिम. हे वर्ग, पद्धती, चल (पद्धती पॅरामीटर्ससह) वर लागू केले जाऊ शकते. वर्गासाठी, अंतिम कीवर्डचा अर्थ असा आहे की वर्गामध्ये उपवर्ग असू शकत नाहीत, म्हणजे वारसा निषिद्ध आहे... अपरिवर्तनीय (अपरिवर्तनीय) वस्तू तयार करताना हे उपयुक्त आहे. उदाहरणार्थ, स्ट्रिंग वर्ग अंतिम म्हणून घोषित केला जातो.

    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");
        }
    }
आदिम प्रकाराच्या व्हेरिएबल्ससाठी, अंतिम कीवर्डचा अर्थ असा होतो की मूल्य, एकदा नियुक्त केल्यानंतर, बदलता येत नाही. संदर्भ व्हेरिएबल्ससाठी, याचा अर्थ असा की ऑब्जेक्ट नियुक्त केल्यानंतर, आपण त्या ऑब्जेक्टचा संदर्भ बदलू शकत नाही. हे महत्वाचे आहे! संदर्भ बदलला जाऊ शकत नाही, परंतु ऑब्जेक्टची स्थिती बदलली जाऊ शकते. Java 8 ने एक नवीन संकल्पना सादर केली: प्रभावीपणे अंतिम. हे फक्त व्हेरिएबल्सवर लागू होते (पद्धती पॅरामीटर्ससह). शेवटची ओळ अशी आहे की अंतिम कीवर्डची स्पष्ट अनुपस्थिती असूनही, इनिशिएलायझेशननंतर व्हेरिएबलचे मूल्य बदलत नाही. दुसऱ्या शब्दांत, अंतिम कीवर्ड संकलन त्रुटीशिवाय अशा व्हेरिएबलवर लागू केला जाऊ शकतो. स्थानिक वर्ग (स्थानिक आतील वर्ग), अनामित वर्ग (अनामिक अंतर्गत वर्ग) आणि प्रवाह (स्ट्रीम API) मध्ये प्रभावीपणे अंतिम व्हेरिएबल्स वापरले जाऊ शकतात.

        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
        }
आता एक छोटीशी मुलाखत घेऊ. शेवटी, कोडजिम कोर्स पूर्ण करण्याचे ध्येय जावा डेव्हलपर बनणे आणि एक मनोरंजक आणि चांगल्या पगाराची नोकरी शोधणे हे आहे. तर, चला सुरुवात करूया.
  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. हो आपण करू शकतो. ऑब्जेक्ट्ससह वापरताना काटेरी अंतिम कीवर्डचा अर्थ काय आहे हे समजून घेणे ही मुख्य गोष्ट आहे. रिफ्लेक्शन API मूल्ये बदलण्यासाठी वापरले जाऊ शकते.


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
         */
    }
}
कृपया लक्षात घ्या की जर आपण अशा प्रकारे आदिम प्रकाराचे अंतिम चल बदलण्याचा प्रयत्न केला असता तर काहीही झाले नसते. मी सुचवितो की तुम्ही स्वतःला पटवून द्या: जावा क्लास तयार करा, उदाहरणार्थ, अंतिम इंट फील्डसह आणि रिफ्लेक्शन API वापरून त्याचे मूल्य बदलण्याचा प्रयत्न करा. सर्वांना शुभेच्छा!