1. सभी वर्ग इनहेरिट करते हैंObject
जावा में सभी वर्ग निहित रूप से Object
वर्ग को इनहेरिट करते हैं।
हम विश्लेषण करेंगे कि विरासत क्या है और यह जावा कोर खोज में जावा में कैसे काम करती है। अभी के लिए, हम एक साधारण तथ्य पर विचार करेंगे जो इससे निकलता है:
किसी भी वर्ग की वस्तु को एक Object
चर को सौंपा जा सकता है। उदाहरण:
कोड | टिप्पणी |
---|---|
|
चर किसी वस्तु o के संदर्भ को संग्रहीत करता हैScanner |
|
चर किसी वस्तु o के संदर्भ को संग्रहीत करता हैString |
|
चर किसी वस्तु o के संदर्भ को संग्रहीत करता हैInteger |
|
चर किसी वस्तु o के संदर्भ को संग्रहीत करता हैString |
यहीं से खुशखबरी खत्म होती है। कंपाइलर एक चर में सहेजे गए मूल प्रकार के ऑब्जेक्ट का ट्रैक नहीं रखता है Object
, इसलिए आप क्लास के तरीकों के अलावा सहेजे गए ऑब्जेक्ट पर तरीकों को कॉल करने में सक्षम नहीं होंगे। Object
यदि आपको ऑब्जेक्ट के मूल प्रकार से जुड़े तरीकों को कॉल करने की आवश्यकता है, तो आपको पहले इसके संदर्भ को सही प्रकार के चर में सहेजना होगा, और फिर उस चर पर विधियों को कॉल करना होगा:
कोड | टिप्पणी |
---|---|
|
कार्यक्रम संकलित नहीं होगा। वर्ग के पास कोई तरीका Object नहीं है ।nextInt() |
|
यह काम करेगा। यहां हम एक टाइपकास्ट ऑपरेटर का उपयोग करके एक चर में एक वस्तु के संदर्भ को सहेजते हैं । Scanner Scanner |
आप केवल एक स्कैनर चर के लिए एक चर नहीं जा सकते हैं और असाइन नहीं कर सकते हैं Object
, भले ही चर किसी ऑब्जेक्ट को Object
संदर्भित करता हो । Scanner
लेकिन आप ऐसा कर सकते हैं यदि आप टाइपकास्ट ऑपरेटर का उपयोग करते हैं , जिसके बारे में आप पहले से ही जानते हैं। यह इसकी सामान्य उपस्थिति है:
Type name1 = (Type) name2;
कहाँ name1
एक चर का नाम है Type
, और एक चर name2
का नाम है जो किसी वस्तु के संदर्भ को संग्रहीत करता है।Object
Type
टाइपकास्टिंग
यदि चर का प्रकार और वस्तु का प्रकार मेल नहीं खाता है, तो a ClassCastException
फेंका जाएगा। उदाहरण:
कोड | टिप्पणी |
---|---|
|
रनटाइम पर एक त्रुटि उत्पन्न होगी: a को ClassCastException यहां फेंका जाएगा |
जावा में इस त्रुटि से बचने का एक तरीका है: हम एक चर में संग्रहीत वस्तु के प्रकार की जाँच करके ऐसा करते हैं :
name instanceof Type
ऑपरेटर instanceof
जाँचता है कि क्या name
चर एक Type
वस्तु है।
एक उदाहरण के रूप में, आइए विविध वस्तुओं की एक सरणी में एक स्ट्रिंग खोजें:
कोड | टिप्पणी |
---|---|
|
ऑटोबॉक्सिंग इन मानों को क्रमशः Integer , String , और , में बदल देगी । ऑब्जेक्ट की सरणी पर लूप करें यदि ऑब्जेक्ट एक वेरिएबल में सेव है तो स्क्रीन पर वेरिएबल प्रदर्शित करें। Double String String |
2. जेनरिक क्यों दिखाई दिए - संग्रह
चलिए संग्रह पर लौटते हैं।
जैसे ही जावा डेवलपर्स ने ArrayList
कक्षा बनाई, वे इसे सार्वभौमिक बनाना चाहते थे, ताकि यह किसी भी प्रकार की वस्तु को स्टोर कर सके। इसलिए उन्होंने Object
तत्वों को संग्रहित करने के लिए s की एक सरणी का उपयोग किया।
इस दृष्टिकोण की ताकत यह है कि आप किसी भी प्रकार की वस्तु को संग्रह में जोड़ सकते हैं।
बेशक, कई कमजोरियां हैं।
नुकसान 1.
संग्रह से तत्वों को पुनर्प्राप्त करते समय एक प्रकार का रूपांतरण ऑपरेटर लिखना हमेशा आवश्यक था:
कोड | टिप्पणी |
---|---|
|
Object वस्तुओं के संदर्भों को संग्रहीत करने के लिए एक संग्रह बनाएँ संग्रह को संख्याओं से भरें 10 , 20 , ... 100 ; संग्रह के तत्वों का योग टाइपकास्टिंग आवश्यक है |
हानि 2.
इस बात की कोई गारंटी नहीं थी कि संग्रह में एक विशिष्ट प्रकार का तत्व है
कोड | टिप्पणी |
---|---|
|
Object वस्तुओं के संदर्भों को संग्रहीत करने के लिए एक संग्रह बनाएँ हम संग्रह को Double वस्तुओं के रूप में दर्शाई गई संख्याओं से भरते हैं: 0.0 , 2.5 , 5.0 , ... संग्रह के तत्वों का योग एक त्रुटि होगी: a को Double किसी में नहीं डाला जा सकताInteger |
डेटा को संग्रह में कहीं भी रखा जा सकता है:
- दूसरे तरीके से
- दूसरे कार्यक्रम में
- एक फ़ाइल से
- नेटवर्क पर
हानि 3.
संग्रह में डेटा गलती से बदला जा सकता है।
आप अपने डेटा से भरे संग्रह को किसी विधि से पास कर सकते हैं। वह विधि, जो एक अलग प्रोग्रामर द्वारा लिखी गई है, अपने डेटा को आपके संग्रह में जोड़ती है।
संग्रह का नाम स्पष्ट रूप से इंगित नहीं करता है कि इसमें किस प्रकार का डेटा संग्रहीत किया जा सकता है। और भले ही आप अपने चर को एक स्पष्ट नाम दें, इसके संदर्भ में एक दर्जन विधियों को पारित किया जा सकता है, और उन विधियों को निश्चित रूप से चर के मूल नाम के बारे में कुछ भी पता नहीं चलेगा।
3. जेनरिक
जावा में, जेनरिक नामक इस अच्छी चीज से इन सभी समस्याओं को समाप्त कर दिया जाता है।
जावा में, जेनरिक का अर्थ है टाइप पैरामीटर को टाइप करने की क्षमता। नतीजा एक जटिल समग्र प्रकार है। इस तरह के मिश्रित प्रकार का सामान्य दृश्य यह है:
ClassName<TypeParameter>
यह एक सामान्य वर्ग है। और इसका उपयोग जहाँ भी आप आमतौर पर कक्षाओं का उपयोग करते हैं, किया जा सकता है।
कोड | विवरण |
---|---|
|
चर बनाना |
|
वस्तुओं का निर्माण |
|
सरणियाँ बनाना |
Integer
ऐसे संग्रह में केवल चर ही संग्रहीत किए जा सकते हैं:
कोड | विवरण |
---|---|
|
ArrayList Integer तत्वों के साथ संग्रह इसकी अनुमति है और यह भी काम करेगा
ऑटोबॉक्सिंग
लेकिन इसकी अनुमति नहीं है: संकलन त्रुटि |
आप सीखेंगे कि जावा कलेक्शंस खोज में टाइप पैरामीटर के साथ अपनी खुद की कक्षाएं कैसे बनाएं। अभी के लिए, हम देखेंगे कि उनका उपयोग कैसे करना है और वे कैसे काम करते हैं।
4. जेनरिक कैसे काम करते हैं
वास्तव में, जेनरिक बहुत आदिम हैं।
कंपाइलर केवल सामान्य प्रकारों को सामान्य प्रकारों से बदल देता है। लेकिन जब एक सामान्य प्रकार के तरीकों का उपयोग किया जाता है, तो कंपाइलर टाइप पैरामीटर में पैरामीटर डालने के लिए टाइपकास्ट ऑपरेटर जोड़ता है:
कोड | कंपाइलर क्या करता है |
---|---|
|
|
|
|
|
|
|
|
मान लीजिए कि हमारे पास एक ऐसी विधि है जो पूर्णांकों के संग्रह में संख्याओं का योग करती है:
कोड | कंपाइलर क्या करता है |
---|---|
|
|
दूसरे शब्दों में, जेनरिक एक प्रकार की सिंटैक्टिक चीनी है, जैसे ऑटोबॉक्सिंग, लेकिन थोड़ा और। ऑटोबॉक्सिंग के साथ, कंपाइलर a को int
a Integer
और इसके विपरीत में परिवर्तित करने के तरीके जोड़ता है, और जेनरिक के लिए यह टाइपकास्ट ऑपरेटर जोड़ता है।
कंपाइलर आपके सामान्य वर्गों को टाइप पैरामीटर के साथ संकलित करने के बाद, वे साधारण कक्षाओं और टाइपकास्ट ऑपरेटरों में परिवर्तित हो जाते हैं। सामान्य प्रकार के वेरिएबल्स को पास किए गए प्रकार के तर्कों के बारे में जानकारी खो गई है। इस प्रभाव को टाइप इरेज़र भी कहा जाता है ।
कभी-कभी सामान्य वर्ग (टाइप पैरामीटर वाले वर्ग) लिखने वाले प्रोग्रामर को वास्तव में तर्कों के रूप में पारित प्रकारों के बारे में जानकारी की आवश्यकता होती है। जावा कलेक्शंस खोज में, आप सीखेंगे कि इससे कैसे निपटा जाए और इसमें क्या शामिल है।
5. जेनरिक के बारे में कुछ तथ्य
यहां जेनरिक के बारे में कुछ और रोचक तथ्य दिए गए हैं।
कक्षाओं में कई प्रकार के पैरामीटर हो सकते हैं। ऐसा कुछ दिखता है:
ClassName<TypeParameter1, TypeParameter2, TypeParameter3>
वास्तव में, यह वास्तव में आश्चर्यजनक नहीं है। कहीं भी संकलक एक ऑपरेटर को एक प्रकार में डालने के लिए जोड़ सकता है, यह कई टाइपकास्ट ऑपरेटरों को जोड़ सकता है।
उदाहरण:
कोड | टिप्पणी |
---|---|
|
विधि put का पहला पैरामीटर a है Integer , और दूसरा a हैString |
सामान्य प्रकार का उपयोग पैरामीटर के रूप में भी किया जा सकता है । ऐसा कुछ दिखता है:
ClassName<TypeParameter<TypeParameterParameter>>
मान लीजिए हम एक सूची बनाना चाहते हैं जो स्ट्रिंग्स की सूचियों को संग्रहीत करेगी। इस मामले में, हमें ऐसा कुछ मिलेगा:
// List of greetings
ArrayList<String> listHello = new ArrayList<String>();
listHello.add ("Hello");
listHello.add ("Hi");
// List of goodbyes
ArrayList<String> listBye = new ArrayList<String>();
listBye.add("Bye");
listBye.add ("Goodbye");
// List of lists
ArrayList<ArrayList<String>> lists = new ArrayList<ArrayList<String>>();
lists.add(listHello);
lists.add(listBye);
सामान्य प्रकार (प्रकार पैरामीटर वाले प्रकार) का उपयोग सरणी प्रकार के रूप में भी किया जा सकता है। ऐसा कुछ दिखता है:
ClassName<TypeParameter>[] array = new ClassName<TypeParameter>[size];
यहां कुछ भी जादुई नहीं हो रहा है: कोण ब्रैकेट केवल प्रकार का नाम इंगित करते हैं:
कोड | गैर-सामान्य समकक्ष |
---|---|
|
|
|
|
|
|