सबसे पहले, हम केवल स्थानीय चर के बारे में बात कर रहे हैं । प्रभावी रूप से अंतिम क्षेत्रों पर लागू नहीं होता है। यह महत्वपूर्ण है, क्योंकि final
खेतों के लिए शब्दार्थ बहुत अलग हैं और भारी संकलक अनुकूलन और मेमोरी मॉडल वादों के अधीन हैं, अंतिम क्षेत्रों के शब्दार्थों पर $ 17.5.1 देखें ।
सतह के स्तर पर final
और effectively final
स्थानीय चर के लिए वास्तव में समान हैं। हालांकि, जेएलएस दोनों के बीच एक स्पष्ट अंतर बनाता है जो वास्तव में इस तरह की विशेष स्थितियों में प्रभाव की एक विस्तृत श्रृंखला है।
आधार
चर के बारे में JLS§4.12.4 से final
:
एक स्थिर चर आदिम प्रकार या स्ट्रिंग का एक final
चर है जो एक स्थिर अभिव्यक्ति ( .215.29 ) के साथ प्रारंभ होता है । वैरिएबल एक स्थिर वैरिएबल है या क्लास इनिशियलाइज़ेशन ( is12.4.1 ), बाइनरी कम्पैटिबिलिटी ( compatibility13.1 ), रीचैबिलिटी ( .214.22 ), और निश्चित असाइनमेंट ( §16.1.1 ) के संबंध में निहितार्थ नहीं हो सकता है ।
चूँकि int
आदिम है, चर a
एक ऐसा स्थिर चर है ।
आगे, इसी अध्याय के बारे में effectively final
:
कुछ चर जिन्हें अंतिम घोषित नहीं किया जाता है, उन्हें प्रभावी रूप से अंतिम माना जाता है: ...
तो जिस तरह से यह शब्दों में है, यह है कि अन्य उदाहरण में, स्पष्ट है a
है नहीं एक निरंतर चर माना जाता है, के रूप में यह है अंतिम नहीं है, लेकिन केवल प्रभावी ढंग से अंतिम।
व्यवहार
अब जब हमारे पास अंतर है, तो यह देखने की सुविधा देता है कि क्या चल रहा है और आउटपुट अलग क्यों है।
आप ? :
यहां सशर्त ऑपरेटर का उपयोग कर रहे हैं, इसलिए हमें इसकी परिभाषा जांचनी होगी। से JLS§15.25 :
तीन प्रकार की सशर्त अभिव्यक्तियाँ हैं, दूसरे और तीसरे संक्रियात्मक अभिव्यक्तियों के अनुसार वर्गीकृत: बूलियन सशर्त अभिव्यक्तियाँ , संख्यात्मक सशर्त अभिव्यक्तियाँ और संदर्भ सशर्त अभिव्यक्तियाँ ।
इस मामले में, हम JLS.215.25.2 से एक संख्यात्मक सशर्त अभिव्यक्तियों के बारे में बात कर रहे हैं :
एक संख्यात्मक सशर्त अभिव्यक्ति का प्रकार निम्नानुसार निर्धारित किया जाता है:
और यह वह हिस्सा है जहां दो मामलों को अलग-अलग वर्गीकृत किया जाता है।
प्रभावी रूप से अंतिम
effectively final
इस नियम से मेल खाने वाला संस्करण :
अन्यथा, सामान्य संख्यात्मक पदोन्नति ( §5.6 ) दूसरे और तीसरे ऑपरेंड पर लागू होती है, और सशर्त अभिव्यक्ति का प्रकार दूसरे और तीसरे ऑपरेंड का प्रचारित प्रकार है।
कौन करता है, तो आप क्या करेंगे के रूप में ही व्यवहार है 5 + 'd'
, यानी int + char
, में जो परिणाम int
। JLS§5.6 देखें
न्यूमेरिक प्रमोशन एक संख्यात्मक संदर्भ में सभी अभिव्यक्तियों के प्रचारित प्रकार को निर्धारित करता है। पदोन्नत प्रकार को इस तरह चुना जाता है कि प्रत्येक अभिव्यक्ति को पदोन्नत प्रकार में परिवर्तित किया जा सकता है, और, अंकगणितीय ऑपरेशन के मामले में, ऑपरेशन को पदोन्नत प्रकार के मूल्यों के लिए परिभाषित किया गया है। संख्यात्मक संदर्भ में अभिव्यक्तियों का क्रम संख्यात्मक संवर्धन के लिए महत्वपूर्ण नहीं है। नियम इस प्रकार हैं:
[...]
इसके बाद, आदिम रूपांतरण को चौड़ा ( §5.1.2 ) और आदिम रूपांतरण संकुचन ( §5.1.3 ) कुछ भाव पर लागू होते हैं, निम्नलिखित नियमों के अनुसार:
संख्यात्मक विकल्प के संदर्भ में, निम्नलिखित नियम लागू होते हैं:
किसी भी अभिव्यक्ति प्रकार का है, तो int
और है एक निरंतर अभिव्यक्ति नहीं ( §15.29 ), तो पदोन्नत प्रकार है int
, और अन्य भाव उस प्रकार के नहीं हैं int
गुजरना आदिम रूपांतरण को चौड़ा करने के लिए int
।
तो सब कुछ के int
रूप a
में एक int
पहले से ही पदोन्नत किया है । के आउटपुट के बारे में बताते हैं 97
।
अंतिम
final
चर के साथ संस्करण इस नियम से मेल खाता है:
यदि ऑपरेंड में से एक प्रकार का है , T
जहां T
है byte
, short
या char
, और अन्य ऑपरेंड प्रकार का एक स्थिर अभिव्यक्ति ( of15.29 ) है int
जिसका मान प्रकार में प्रतिनिधित्व करने योग्य है T
, तो सशर्त अभिव्यक्ति का प्रकार है T
।
अंतिम चर a
प्रकार int
और एक स्थिर अभिव्यक्ति है (क्योंकि यह है final
)। यह के रूप में प्रतिनिधित्व करने योग्य है char
, इसलिए परिणाम प्रकार का है char
। जो आउटपुट को समाप्त करता है a
।
स्ट्रिंग उदाहरण
स्ट्रिंग समानता के साथ उदाहरण समान मूल अंतर पर आधारित है, final
चर को स्थिर अभिव्यक्ति / चर के रूप में माना जाता है, और effectively final
नहीं है।
जावा में, स्ट्रिंग इंटर्निंग निरंतर अभिव्यक्तियों पर आधारित है, इसलिए
"a" + "b" + "c" == "abc"
है true
के रूप में अच्छी तरह से (न वास्तविक कोड में इस संरचना का उपयोग करें)।
देखें JLS§3.10.5 :
इसके अलावा, एक स्ट्रिंग शाब्दिक हमेशा कक्षा स्ट्रिंग के एक ही उदाहरण को संदर्भित करता है। ऐसा इसलिए है क्योंकि स्ट्रिंग शाब्दिक - या, अधिक सामान्यतः , स्ट्रिंग्स जो निरंतर अभिव्यक्तियों ( .215.29 ) के मान हैं - "इंटर्न" हैं, इसलिए अद्वितीय उदाहरणों को साझा करने के लिए, विधि का उपयोग करके String.intern
( .512.5 )।
अनदेखी करना आसान है क्योंकि यह मुख्य रूप से शाब्दिक के बारे में बात कर रहा है, लेकिन यह वास्तव में निरंतर अभिव्यक्तियों पर भी लागू होता है।