अशक्त वस्तु है?


119

Objectजावा में शून्य है ?


41
नहीं यह नहीं है, और उन लोगों के लिए जो आश्चर्य करते हैं कि ऐसा सवाल क्यों है, ऐसी भाषाएं हैं जहां अशक्त वास्तव में किसी भी तरह की वस्तु है, उदाहरण के लिए रूबी।
JRL

7
स्काला में, जो कि प्रकारों के बारे में बहुत ही सूक्ष्म है, एक प्रकार Null(एक लक्षण , वास्तव में) में एक उदाहरण है null
कार्ल स्मोत्रिकज़

1
@JRL: बस जिज्ञासा से बाहर, मुझे आश्चर्य है कि यह कैसे प्रभावित करता है कि JRuby कैसे काम करता है ... (मैं निश्चित रूप से जानने के लिए कार्यान्वयन के उस स्तर से परिचित नहीं हूं।)
बेंजामिन

@ JRL की टिप्पणी करने के लिए जोड़ने के लिए - रूबी के किसी न किसी बराबर करने के लिए nullहै nil, जिनमें से एक उदाहरण है NilClass
एलियट साइक्स

या जावास्क्रिप्ट, जिसमें null instanceof Objectझूठ है, लेकिन typeof(null)वापस आ जाता है 'object'। क्या यह उस मामले में एक वस्तु है? कौन जाने।
डॉन हैच

जवाबों:


166

यदि नल एक वस्तु थे, तो यह java.lang.Objectइस तरह के तरीकों का समर्थन करेगा equals()। हालांकि, यह मामला नहीं है - अशक्त परिणामों पर किसी भी विधि का आह्वान NullPointerException

और इस विषय पर जावा भाषा विनिर्देश का क्या कहना है:

एक विशेष नल प्रकार भी है, अभिव्यक्ति नल का प्रकार, जिसका कोई नाम नहीं है। क्योंकि null प्रकार का कोई नाम नहीं है, इसलिए null प्रकार के चर को घोषित करना या null प्रकार को डालना असंभव है। अशक्त संदर्भ शून्य प्रकार की अभिव्यक्ति का एकमात्र संभव मूल्य है। अशक्त संदर्भ को हमेशा किसी भी संदर्भ प्रकार में डाला जा सकता है। व्यवहार में, प्रोग्रामर अशक्त प्रकार को अनदेखा कर सकता है और सिर्फ यह दिखावा कर सकता है कि अशक्त केवल एक विशेष शाब्दिक है जो किसी भी संदर्भ प्रकार का हो सकता है।

मुझे लगता है कि यह "शून्य विशेष" के लिए उबला हुआ हो सकता है।


1
तो जावा में एक वस्तु केवल एक वस्तु है अगर यह समान या उपवर्गों के बराबर है java.lang.Object। व्यावहारिक रूप से - हाँ। आप एक ऐसा वर्ग नहीं बना सकते जो java.lang.Object का एक उपवर्ग नहीं है, लेकिन मैंने इसके बारे में अधिक दार्शनिक दृष्टिकोण से कभी नहीं सोचा था
Andreas Dolk

उत्सुकतावश, सभी चीजों के लिए, एपीआई डॉकNullPointerException एक » nullऑब्जेक्ट«… :) का उल्लेख करता है , लेकिन फिर, इसके बारे में बात करना भी ठीक था »अशक्त बिंदु«…
लूमी

आपने कहा: "अशक्त संदर्भ को हमेशा किसी भी प्रकार के संदर्भ में रखा जा सकता है"। तो, क्या हम ऑब्जेक्ट संदर्भ (वापसी) प्रकार के साथ एक विधि में अशक्त (टाइपकास्टेड-यदि अनुमति दी गई) वापस कर सकते हैं?
श्रीचक्रधर

1
@ श्रीचक्रधर: हाँ, हम कर सकते हैं! जिसे आप यहां पूछकर कोड की कोशिश करके अधिक आसानी से पता लगा सकते हैं।
माइकल बोर्गवर्ड

1
"अशक्त संदर्भ शून्य प्रकार की अभिव्यक्ति का एकमात्र संभव मूल्य है"। यह विनिर्देशन डॉक्टर को पढ़ने का समय है। :)
sofs1

32

जावा युक्ति के अनुसार , nullएक प्रकार है जिसे ऑब्जेक्ट चर में सौंपा जा सकता है (टिप्पणी में नोट किए गए मान के रूप में)। आप इस प्रकार के चर को तुरंत नहीं बना सकते हैं या बना नहीं सकते हैं, लेकिन आपको nullकंपाइलर द्वारा दिए गए शाब्दिक का उपयोग करना होगा ।


8
नल एक प्रकार और मूल्य है।
जोकिम सॉर

5
nullनाम एक के "उदाहरण" है nullप्रकार, जाहिरा तौर पर।
strager

nullवैरिएबल नहीं है, यह एक शाब्दिक है: जेएलएस, 3.10.7। द
न्यू

पुन: " nullएक प्रकार है जिसे सौंपा जा सकता है ": 1) null(कोड में) शून्य शाब्दिक है , शून्य प्रकार 2 नहीं) प्रकार सामान्य रूप से जावा में चर को नहीं सौंपा जा सकता है, JLS 4.1 देखें : " हैं [...] ] दो प्रकार के डेटा मान जिन्हें चर में संग्रहीत किया जा सकता है [...]: आदिम मान (of4.2) और संदर्भ मान (values4.3)। " यह अशक्त संदर्भ है जिसे nullशाब्दिक के माध्यम से सौंपा जा सकता है । ... cont'd ...
जेरोल्ड ब्रोसर

3) ऑब्जेक्ट " वैरिएबल वैरिएबल " में, क्लास वैरिएबल की तुलना में, आमतौर पर टाइप को संदर्भित नहीं करता है, लेकिन जीवन भर के लिए। प्रकार का संदर्भ देते समय इसे आमतौर पर संदर्भ प्रकार का चर कहा जाता है या, संक्षिप्त, संदर्भ (प्रकार) चर के लिए। मुझे जावा एपीआई में 4 प्रकारों के बारे में पता है जो उदाहरण / ऑब्जेक्ट चर (वहाँ अधिक हो सकता है) को उजागर करते हैं: इसकेlength और उपवर्गों के साथ सरणियाँjava.awt.geom.Point2D
जेरोल्ड ब्रॉसर



12

अशक्त वस्तु का अभाव है।


लेकिन अशक्त प्रकार हर संदर्भ प्रकार के लिए उपलब्ध है।
टॉम हॉल्टिन -

कोई "अशक्त प्रकार" नहीं है; अशक्त गैर-आदिम अभिव्यक्तियों का विशिष्ट मूल्य है (अर्थात संदर्भ; मेरी समझ में जावा में कोई "संदर्भ प्रकार" नहीं है)।
टॉमी मैकगायर

3
टॉमी: जेएलएस 4.1: "एक विशेष अशक्त प्रकार भी है, अभिव्यक्ति नल का प्रकार, जिसका कोई नाम नहीं है।"
केन


12

JRL ने लिखा:

नहीं यह नहीं, ...

जैसा कि अक्सर, यह निर्भर करता है कि आप इसे कहाँ देखते हैं, आप किस पर अधिक विश्वास करते हैं।

जेएलएस के अनुसार, हाँ, यह है । विशेष रूप से यदि आप इस प्रश्न को फिर से जोड़ते हैं: r क्या nullशाब्दिक प्रकार है Object? ”। JLS 4.1 के अलावा ऊपर माइकल बोर्गवर्ड द्वारा उद्धृत:

देखें JLS 3.10.7 :

एक अशक्त शाब्दिक हमेशा अशक्त प्रकार का होता है।

और JLS 4.10 :

एक प्रकार टी के उपप्रकार सभी प्रकार यू हैं जैसे कि टी यू का एक सुपरटेप है, और अशक्त प्रकार है।

या JLS 4.10.2 :

अशक्त प्रकार के प्रत्यक्ष सुपरपाइप्स केवल नल प्रकार के अलावा सभी संदर्भ प्रकार हैं

[मेरे द्वारा जोर दिया गया।]

ग्रहण 2019-09 के संकलक के अनुसार यह नहीं है :

true.toString();  // Cannot invoke toString() on the primitive type boolean
null.toString();  // Cannot invoke toString() on the primitive type null

OpenJDKs 12.0.1 के अनुसार javac यह है :

true.toString();  // error: boolean cannot be dereferenced
null.toString();  // error: <null> cannot be dereferenced

जहां कोण कोष्ठक का मतलब है कि nullएक आदिम प्रकार के अलावा अन्य है। और जेएलएस 4.1 के अनुसार :

जावा प्रोग्रामिंग भाषा में दो प्रकार के प्रकार होते हैं: आदिम प्रकार (...) और संदर्भ प्रकार (...)।

अगर यह एक नहीं है तो यह दूसरा है।


क्लाउडिया ने लिखा:

अशक्त एक प्रकार का कुरूप है।

एयू गर्भनिरोधक, nullसुंदर है। इसके बजाय आप संदर्भ प्रकार चर के लिए डिफ़ॉल्ट मान के रूप में क्या सुझाव देंगे? एक मनमाना बिट संयोजन? उल्लंघन का उपयोग करने के लिए आपका स्वागत है या, इससे भी बदतर, सूचक नरक!


जोआचिम सौर ने लिखा:

नल एक प्रकार और मूल्य है।

नल के साथ वास्तव में तीन आइटम हैं ( JLS 3.10.7 भी देखें ):

  1. (अन्यथा अनाम) अशक्त प्रकार
  2. null शाब्दिक
  3. अशक्त संदर्भ मूल्य। (आमतौर पर के रूप में संक्षिप्त शून्य मान या बस अशक्त ।)

(1) ध्यान दें कि, ऊपर वर्णित JLS 4.10.2 के अनुसार , अशक्त प्रकार न केवल इंटरफेस के लिए बल्कि कक्षाओं के लिए भी कई विरासत का उपयोग करता है। जो हम सभी जानते हैं कि हमारे लिए एप्लिकेशन प्रोग्रामर संभव नहीं है।

(२) अशक्त शाब्दिक की कल्पना एक चर के रूप में की जा सकती है:

JVM_global final null_type null = new null_type();

नोट JLS 3.9 :

कई प्रकार के चरित्र अनुक्रम कभी-कभी गलत तरीके से ग्रहण किए जाते हैं, कीवर्ड के लिए:

  • nullएक खोजशब्द नहीं है, बल्कि अशक्त शाब्दिक ( .73.10.7 ) है।

विषय में null instanceof <any type>

जेएलएस 4.10.2 को ध्यान में रखते हुए ( is अशक्त प्रकार हर प्रकार का एक उपप्रकार है) ’ null instanceof <any type>का मूल्यांकन करना trueचाहिए, क्या ऐसा नहीं होना चाहिए? पहली नजर में, हाँ, लेकिन JLS 15.20.2 अंतर्दृष्टि जवाब देता है:

[...] परिणाम के instanceofऑपरेटर है trueअगर मूल्य की RelationalExpression नहीं हैnull [...]। अन्यथा परिणाम हैfalse

[मेरे द्वारा जोर दिया गया।]

अपने आप से पूछें कि क्या अधिक समझ में आता है (एक आवेदन प्रोग्रामर के दृष्टिकोण से):

  • देते हुए falseऔर इस तरह इंगित करते हुए कि एक संदर्भ अभिव्यक्ति हमारे लिए एक प्रकार का नहीं है, अर्थात यह दर्शाता है कि यह हमारे लिए उपयोगी कुछ भी संदर्भित नहीं कर रहा है।

  • या trueइस प्रकार, हमें सूचित करते हुए कि अभिव्यक्ति एक विशेष संदर्भ, अशक्त संदर्भ का मूल्यांकन करती है , एक "वस्तु" का संदर्भ देते हुए, हम नहीं जानते कि क्या यह मौजूद है और जो विशेष शून्य प्रकार का है जिसका कोई नाम नहीं है, के संपर्क में नहीं है हमें, लेकिन अशक्त शाब्दिक के माध्यम से , किसी भी प्रकार की एक बहुउद्देशीयता सहित कई प्रकारों का एक उपप्रकार है और वैसे भी अनदेखा किया जाना है? अधिक व्यावहारिक उदाहरण पर भी विचार करें:

     class Car implements Vehicle {  
     ...
     Vehicle car = null;
     ...
     boolean b = car instanceof Car;  // True? There's not even an instance
     ...                              // which could be of type Car.

जिसके कारण यह भी होता है:

क्यों instanceofकुछ के बारे में कहने का उचित तरीका नहीं हैnullऑब्जेक्ट-नेस के ?

इसे instanceofनहीं कहा जाता है sameorsubtypeof। इसका मतलब है कि हम एक उदाहरण के प्रकार की तुलना एक प्रकार से कर रहे हैं, दो प्रकारों से नहीं। अब nullइसका मतलब है: „कोई उदाहरण नहीं है” और अगर कोई उदाहरण नहीं है तो कोई उदाहरण नहीं है। यह स्पष्ट है कि किसी चीज़ के साथ कुछ भी तुलना करना नेतृत्व करने के लिए नहीं है false

या "अधिक" वास्तविक दुनिया उदाहरण में:

  • मेरे हाथ में एक सेब ( = संदर्भ प्रकार ) का वास्तविक आकार का चित्र है, जिस पर लिखा है »बिग एप्पल« ( = संदर्भ प्रकार नाम )।
  • मेरे सामने एक टेबल ( = ढेर ) है।
  • यदि मेज पर एक सेब ( = उदाहरण ) है तो उससे जुड़ा एक कॉर्ड ( = संदर्भ ) है।
  • मैं अपने हाथ ( = संदर्भ चर ) में इस कॉर्ड के दूसरे छोर को पकड़ता हूं ।
  • मैं कॉर्ड के साथ सेब का पता लगाता हूं और अपनी तस्वीर ( = इंस्टाफ ) से तुलना करता हूं ।
  • यदि सेब एक ही आकार का है या चित्र से बड़ा है »बिग एप्पल« इस पर लागू होता है ( = सच) )।
  • यदि यह छोटा है, तो ( = गलत नहीं है) )।
  • यदि टेबल पर कोई सेब नहीं है (= कोई उदाहरण नहीं है ) और, इसलिए, कोई कॉर्ड मौजूद नहीं है ( = null ) लेखन या तो लागू नहीं होता है ( = गलत )। क्योंकि: क्या कोई सेब बड़ा सेब नहीं है? नहीं यह नहीं।


जैसा कि माइकल ने कहा है: "अशक्त विशेष है"।


2
सेब और अशक्त? क्या आप एक मुकदमे से नहीं डरते? :)
गेबर लिप्टक

9

नहीं, यह न तो कक्षा का उदाहरण है और न ही कक्षा का। यह कुछ भी नहीं के लिए एक संदर्भ है।

संपादित करें : कल्पना नहीं पढ़ी है इसलिए ऊपर 100% सटीक नहीं हो सकता है।


5

जैसा कि अध्याय ४.१ में बताया गया है। जावा लैंग्वेज स्पेसिफिकेशन के प्रकार और प्रकार के प्रकार , शून्य एक प्रकार है जिसका एक मान है, शून्य संदर्भ (और शाब्दिक द्वारा दर्शाया गया है null):

एक विशेष अशक्त प्रकार भी है , अभिव्यक्ति का प्रकार null, जिसका कोई नाम नहीं है। क्योंकि null प्रकार का कोई नाम नहीं है, इसलिए null प्रकार के चर को घोषित करना या null प्रकार को डालना असंभव है। अशक्त संदर्भ शून्य प्रकार की अभिव्यक्ति का एकमात्र संभव मूल्य है। अशक्त संदर्भ को हमेशा किसी भी संदर्भ प्रकार में डाला जा सकता है। व्यवहार में, प्रोग्रामर अशक्त प्रकार को अनदेखा कर सकता है और सिर्फ दिखावा nullकर सकता है कि यह केवल एक विशेष शाब्दिक है जो किसी भी संदर्भ प्रकार का हो सकता है।

यद्यपि आप अशक्त वस्तु पैटर्न के बारे में पढ़ना चाहते हैं (जो मैं अनुशंसा नहीं करता)। इस पैटर्न पर अधिक जानकारी के लिए C2 Wiki या विकिपीडिया देखें ।



4

नहीं, यह कोई वस्तु नहीं है क्योंकि अशक्त इंस्टाफॉरेक्ष् य वस्तु हमेशा झूठी वापस आएगी भी केवल एक अशक्त है, प्रत्येक वर्ग के लिए एक नहीं।


3
वास्तव null instanceof <anytype>में false, भी वापस आ जाएगी ।
बॉम्बे

4

जावा स्पेस के अनुसार ,

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


4

जावा संदर्भ के माध्यम से वस्तुओं को संभालता है। नल जावा के OO-ness का टूटना है, क्योंकि यह आपको OO के स्तर से नीचे गिराता है। नहीं, यह एक वस्तु नहीं है यह एक संदर्भ का मूल्य है। और इसका वस्तुगत प्रतिमानों से कोई लेना-देना नहीं है, लेकिन जावा की पाइपलाइन से संबंधित है, जो वस्तुओं को सक्षम बनाता है।


3

की एक मिसाल है java.lang.Object? नहीं।

अशक्त वस्तु है ? " है " की परिभाषा पर निर्भर करता है


2
Object foo = null;
System.out.println(foo.toString()); 

पहली पंक्ति शो nullटाइप करने के लिए सौंपी जा सकती है Object, लेकिन दूसरी पंक्ति यह प्रदर्शित करेगी कि यह निश्चित रूप से नहीं है Objectऔर अंततः परिणाम हैjava.lang.NullPointerException


1

नहीं, nullयह एक वस्तु नहीं है। यह एक संदर्भ प्रकार है और इसका मूल्य किसी भी वस्तु को संदर्भित नहीं करता है और इसलिए nullस्मृति में कोई प्रतिनिधित्व नहीं है ।


ओपी ने (प्रकार) के लिए कहा Object, ऑब्जेक्ट नहीं (जैसा कि एक प्रकार का उदाहरण )। और अगर कोई अपने अनुसार सवाल को
दोहराता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.